mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-07-16 10:02:59 -07:00
Merge branch 'develop' into ItemName
This commit is contained in:
commit
b81e01ca1f
284 changed files with 28906 additions and 30726 deletions
2
.github/workflows/apt-deps.txt
vendored
2
.github/workflows/apt-deps.txt
vendored
|
@ -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
|
20
.github/workflows/generate-builds.yml
vendored
20
.github/workflows/generate-builds.yml
vendored
|
@ -62,16 +62,16 @@ jobs:
|
|||
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 -j3
|
||||
- name: Upload soh.otr
|
||||
- name: Upload soh.o2r
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: soh.otr
|
||||
path: soh.otr
|
||||
name: soh.o2r
|
||||
path: soh.o2r
|
||||
retention-days: 3
|
||||
|
||||
build-macos:
|
||||
|
@ -122,10 +122,10 @@ jobs:
|
|||
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: |
|
||||
|
@ -233,10 +233,10 @@ jobs:
|
|||
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: |
|
||||
|
@ -298,10 +298,10 @@ jobs:
|
|||
path: vcpkg
|
||||
- name: Configure Developer Command Prompt
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: Download soh.otr
|
||||
- name: Download soh.o2r
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: soh.otr
|
||||
name: soh.o2r
|
||||
path: build-windows/soh
|
||||
- name: Build SoH
|
||||
env:
|
||||
|
|
2
.github/workflows/macports-deps.txt
vendored
2
.github/workflows/macports-deps.txt
vendored
|
@ -1 +1 @@
|
|||
libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal
|
||||
libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal libogg +universal libopus +universal opusfile +universal libvorbis +universal
|
2
.github/workflows/pr-artifacts.yml
vendored
2
.github/workflows/pr-artifacts.yml
vendored
|
@ -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;
|
||||
|
|
12
.github/workflows/test-builds-on-distros.yml
vendored
12
.github/workflows/test-builds-on-distros.yml
vendored
|
@ -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: |
|
||||
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -412,6 +412,7 @@ ReleaseObj/*
|
|||
.tags
|
||||
tags
|
||||
*.otr
|
||||
*.o2r
|
||||
*.sav
|
||||
shipofharkinian.ini
|
||||
shipofharkinian.json
|
||||
|
|
61
CMake/FindOgg.cmake
Normal file
61
CMake/FindOgg.cmake
Normal file
|
@ -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)
|
44
CMake/FindOpus.cmake
Normal file
44
CMake/FindOpus.cmake
Normal file
|
@ -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)
|
55
CMake/FindOpusFile.cmake
Normal file
55
CMake/FindOpusFile.cmake
Normal file
|
@ -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()
|
210
CMake/FindVorbis.cmake
Normal file
210
CMake/FindVorbis.cmake
Normal file
|
@ -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)
|
|
@ -83,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()
|
||||
|
@ -154,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
|
||||
|
@ -174,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_BINARY_DIR}/soh/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)
|
||||
|
@ -199,42 +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 ${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 "$<TARGET_FILE:ZAPD>" --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 ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --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="$<TARGET_FILE_DIR:ZAPD>" -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 "$<TARGET_FILE:ZAPD>" --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 "$<TARGET_FILE:ZAPD>" --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 ${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 "$<TARGET_FILE:ZAPD>" --norom --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}"
|
||||
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --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="$<TARGET_FILE_DIR:ZAPD>" -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
|
||||
)
|
||||
|
||||
|
@ -267,22 +258,12 @@ add_custom_target(CreateOSXIcons
|
|||
)
|
||||
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)")
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 41052efcdf8df8e67517cc93da8975fcd4e14af9
|
||||
Subproject commit 461ab19a36cde807591543397e136cae19aa6e7c
|
2
ZAPDTR
2
ZAPDTR
|
@ -1 +1 @@
|
|||
Subproject commit 2aeababbfb81b00d34673406453e8e8e2deaa27b
|
||||
Subproject commit 684f21a475dcfeee89938ae1f4afc42768a3e7ef
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Name=SOH
|
||||
Exec=soh.sh
|
||||
Exec=soh.elf
|
||||
Terminal=false
|
||||
Icon=sohIcon
|
||||
Type=Application
|
||||
|
|
|
@ -1,338 +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
|
||||
;;
|
||||
79a4f053d34018e59279e6d4b83c7daccd985c87) # v64
|
||||
ROMHASH=ad69c91157f6705e8ab06c79fe08aad47bb57ba7
|
||||
;;
|
||||
82fafee9c6ac7946739282958364ce606077ac65) # n64
|
||||
ROMHASH=ad69c91157f6705e8ab06c79fe08aad47bb57ba7
|
||||
;;
|
||||
18cd0eb65914a21d8fa08dfe71c29d865e9d728a) # v64
|
||||
ROMHASH=d3ecb253776cd847a5aa63d859d8c89a2f37b364
|
||||
;;
|
||||
07940d5609e04b7caac63570731e01189129212e) # n64
|
||||
ROMHASH=d3ecb253776cd847a5aa63d859d8c89a2f37b364
|
||||
;;
|
||||
3ac86253e0c0d55486d212e647350c1527b9c92d) # v64
|
||||
ROMHASH=41b3bdc48d98c48529219919015a1af22f5057c2
|
||||
;;
|
||||
70bf30a9980026e615a1ae8d2735a773cf9fcc94) # n64
|
||||
ROMHASH=41b3bdc48d98c48529219919015a1af22f5057c2
|
||||
;;
|
||||
f9e2b6840b9103e9707ea390089a7b6943592a98) # v64
|
||||
ROMHASH=c892bbda3993e66bd0d56a10ecd30b1ee612210f
|
||||
;;
|
||||
2fae1601aa7ae8d3e03ba3f4dcdfca3a36002ac5) # n64
|
||||
ROMHASH=c892bbda3993e66bd0d56a10ecd30b1ee612210f
|
||||
;;
|
||||
1181034d5f9533f53ebe8e1c781badbee115f5aa) # v64
|
||||
ROMHASH=dbfc81f655187dc6fefd93fa6798face770d579d
|
||||
;;
|
||||
07477067943abe8d0c50285eb4a6cb9ece99e79b) # n64
|
||||
ROMHASH=dbfc81f655187dc6fefd93fa6798face770d579d
|
||||
;;
|
||||
2d8fb7140a9c5d11ce614561e5a36ffef0c17540) # v64
|
||||
ROMHASH=fa5f5942b27480d60243c2d52c0e93e26b9e6b86
|
||||
;;
|
||||
d90bbe422ac728ac54ac6a2c9fec942f7ff04df9) # n64
|
||||
ROMHASH=fa5f5942b27480d60243c2d52c0e93e26b9e6b86
|
||||
;;
|
||||
44c75962911e13bdfdc31b35e0b8e3be6a6a49ab) # v64
|
||||
b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b
|
||||
;;
|
||||
5d47025581060af5ba19e6719c25fea7398e87cf) # n64
|
||||
b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b
|
||||
;;
|
||||
e1d070ad7b017de9f992b362164dcd9d7f820f7e) # v64
|
||||
8b5d13aac69bfbf989861cfdc50b1d840945fc1d
|
||||
;;
|
||||
a8c04cd5aa94a6a32198f36ff2069d43342d18a8) # n64
|
||||
8b5d13aac69bfbf989861cfdc50b1d840945fc1d
|
||||
;;
|
||||
245410280d152f28d5b1c0c0fc37f384db0020cd) # v64
|
||||
0769c84615422d60f16925cd859593cdfa597f84
|
||||
;;
|
||||
fbdc9e444807f9b881e3432cedf66f38746b81d8) # n64
|
||||
0769c84615422d60f16925cd859593cdfa597f84
|
||||
;;
|
||||
b6d33d6bf5d6700c64b6a873ab8b06ff039619bc) # v64
|
||||
2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73
|
||||
;;
|
||||
2c7113d20044f93c82ec888c19aa09ea7797396d) # n64
|
||||
2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73
|
||||
;;
|
||||
06c3c098f0e14ed61811dfaf0e8e4519d7d7a826) # v64
|
||||
dd14e143c4275861fe93ea79d0c02e36ae8c6c2f
|
||||
;;
|
||||
bb3f85bfaad9ae7a20afbf618fc9fe126c8c1b4f) # n64
|
||||
dd14e143c4275861fe93ea79d0c02e36ae8c6c2f
|
||||
;;
|
||||
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
|
||||
;;
|
||||
ad69c91157f6705e8ab06c79fe08aad47bb57ba7|c892bbda3993e66bd0d56a10ecd30b1ee612210f)
|
||||
if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then
|
||||
ROM=N64_NTSC_10
|
||||
OTRNAME="oot.otr"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
d3ecb253776cd847a5aa63d859d8c89a2f37b364|dbfc81f655187dc6fefd93fa6798face770d579d)
|
||||
if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then
|
||||
ROM=N64_NTSC_11
|
||||
OTRNAME="oot.otr"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
41b3bdc48d98c48529219919015a1af22f5057c2|fa5f5942b27480d60243c2d52c0e93e26b9e6b86)
|
||||
if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then
|
||||
ROM=N64_NTSC_12
|
||||
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
|
||||
;;
|
||||
b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b)
|
||||
if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then
|
||||
ROM=GC_NMQ_NTSC_U
|
||||
OTRNAME="oot.otr"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
8b5d13aac69bfbf989861cfdc50b1d840945fc1d)
|
||||
if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then
|
||||
ROM=GC_MQ_NTSC_U
|
||||
OTRNAME="oot-mq.otr"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
0769c84615422d60f16925cd859593cdfa597f84)
|
||||
if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then
|
||||
ROM=GC_NMQ_NTSC_J
|
||||
OTRNAME="oot.otr"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73)
|
||||
if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then
|
||||
ROM=GC_NMQ_NTSC_J_CE
|
||||
OTRNAME="oot.otr"
|
||||
else
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
dd14e143c4275861fe93ea79d0c02e36ae8c6c2f)
|
||||
if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then
|
||||
ROM=GC_MQ_NTSC_J
|
||||
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
|
|
@ -138,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 {{{
|
||||
|
@ -177,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")
|
||||
|
@ -276,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})
|
||||
|
||||
|
@ -318,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/
|
||||
|
@ -349,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}
|
||||
.
|
||||
)
|
||||
|
||||
|
@ -602,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()
|
||||
|
@ -610,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 $<TARGET_FILE_DIR:soh>/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 $<TARGET_FILE_DIR:soh>/assets/extractor
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/xml $<TARGET_FILE_DIR:soh>/assets/extractor/xmls
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists $<TARGET_FILE_DIR:soh>/assets/extractor/filelists
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:soh>/assets/extractor/symbols
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt $<TARGET_FILE_DIR:soh>/assets/extractor/symbols
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt $<TARGET_FILE_DIR:soh>/assets/extractor/symbols
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt $<TARGET_FILE_DIR:soh>/assets/extractor/symbols
|
||||
COMMAND ${VS_COPY_ASSETS_CMD}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/extractor $<TARGET_FILE_DIR:soh>/assets
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/xml $<TARGET_FILE_DIR:soh>/assets/xml
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:soh>/assets/symbols
|
||||
# COMMAND ${VS_COPY_ASSETS_CMD}
|
||||
)
|
||||
endif()
|
||||
################################################################################
|
||||
|
@ -641,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;"
|
||||
|
@ -654,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
|
||||
|
@ -694,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"
|
||||
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:SDL2_net::SDL2_net>"
|
||||
${CMAKE_DL_LIBS}
|
||||
Threads::Threads
|
||||
|
@ -710,11 +736,7 @@ endif()
|
|||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
INSTALL(FILES $<TARGET_PDB_FILE:soh> 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.")
|
||||
|
@ -724,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()
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_MQ_D/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_MQ_D/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_MQ_NTSC_J/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_MQ_NTSC_J/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_MQ_NTSC_U/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_MQ_NTSC_U/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_MQ_PAL_F/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_MQ_PAL_F/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_NMQ_D/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_NMQ_D/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_NMQ_NTSC_J/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_NMQ_NTSC_J/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_NMQ_NTSC_J_CE/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_NMQ_NTSC_J_CE/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_NMQ_NTSC_U/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_NMQ_NTSC_U/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/GC_NMQ_PAL_F/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/GC_NMQ_PAL_F/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/N64_NTSC_10/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/N64_NTSC_10/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/N64_NTSC_11/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/N64_NTSC_11/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/N64_NTSC_12/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/N64_NTSC_12/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/N64_PAL_10/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/N64_PAL_10/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<SymbolMap File="symbols/SymbolMap_OoTMqDbg.txt"/>
|
||||
<ActorList File="symbols/ActorList_OoTMqDbg.txt"/>
|
||||
<ObjectList File="symbols/ObjectList_OoTMqDbg.txt"/>
|
||||
<ExternalXMLFolder Path="assets/extractor/xmls/N64_PAL_11/"/>
|
||||
<ExternalXMLFolder Path="assets/xml/N64_PAL_11/"/>
|
||||
<TexturePool File="TexturePool.xml"/>
|
||||
<ExternalFile XmlPath="objects/gameplay_keep.xml" OutPath="objects/gameplay_keep/"/>
|
||||
</Root>
|
||||
|
|
1532
soh/assets/extractor/filelists/dbg.txt
Normal file
1532
soh/assets/extractor/filelists/dbg.txt
Normal file
File diff suppressed because it is too large
Load diff
1509
soh/assets/extractor/filelists/gamecube.txt
Normal file
1509
soh/assets/extractor/filelists/gamecube.txt
Normal file
File diff suppressed because it is too large
Load diff
1510
soh/assets/extractor/filelists/gamecube_pal.txt
Normal file
1510
soh/assets/extractor/filelists/gamecube_pal.txt
Normal file
File diff suppressed because it is too large
Load diff
1510
soh/assets/extractor/filelists/ntsc_12_oot.txt
Normal file
1510
soh/assets/extractor/filelists/ntsc_12_oot.txt
Normal file
File diff suppressed because it is too large
Load diff
1510
soh/assets/extractor/filelists/ntsc_oot.txt
Normal file
1510
soh/assets/extractor/filelists/ntsc_oot.txt
Normal file
File diff suppressed because it is too large
Load diff
1511
soh/assets/extractor/filelists/pal_oot.txt
Normal file
1511
soh/assets/extractor/filelists/pal_oot.txt
Normal file
File diff suppressed because it is too large
Load diff
472
soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt
Normal file
472
soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt
Normal file
|
@ -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
|
402
soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt
Normal file
402
soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt
Normal file
|
@ -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
|
1
soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt
Normal file
1
soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt
Normal file
|
@ -0,0 +1 @@
|
|||
8012DB20 gMtxClear
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -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 <boost/cstdint.hpp>
|
||||
#include <cstddef>
|
||||
#include <climits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace hash_detail
|
||||
{
|
||||
|
||||
template<uint32_t Bits> 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
|
|
@ -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 <boost_custom/container_hash/hash_fwd_32.hpp>
|
||||
#include <boost_custom/container_hash/version.hpp>
|
||||
|
||||
#if BOOST_VERSION_HAS_HASH_RANGE
|
||||
#include <boost/container_hash/detail/hash_range.hpp>
|
||||
#else
|
||||
#include <boost/type_traits/integral_constant.hpp>
|
||||
#include <boost/type_traits/enable_if.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <cstddef>
|
||||
#include <climits>
|
||||
#include <iterator>
|
||||
#endif // #if BOOST_VERSION_HAS_HASH_RANGE
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace hash_detail
|
||||
{
|
||||
|
||||
#if !BOOST_VERSION_HAS_HASH_RANGE
|
||||
|
||||
template<class T> struct is_char_type: public boost::false_type {};
|
||||
|
||||
#if CHAR_BIT == 8
|
||||
|
||||
template<> struct is_char_type<char>: public boost::true_type {};
|
||||
template<> struct is_char_type<signed char>: public boost::true_type {};
|
||||
template<> struct is_char_type<unsigned char>: public boost::true_type {};
|
||||
|
||||
#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L
|
||||
template<> struct is_char_type<char8_t>: public boost::true_type {};
|
||||
#endif
|
||||
|
||||
#if defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603L
|
||||
template<> struct is_char_type<std::byte>: 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<class It>
|
||||
inline typename BOOST_ENABLE_IF<
|
||||
is_char_type<typename std::iterator_traits<It>::value_type>::value &&
|
||||
BOOST_IS_SAME<typename std::iterator_traits<It>::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<std::size_t>( 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<boost::uint32_t>( static_cast<unsigned char>( first[0] ) ) |
|
||||
static_cast<boost::uint32_t>( static_cast<unsigned char>( first[1] ) ) << 8 |
|
||||
static_cast<boost::uint32_t>( static_cast<unsigned char>( first[2] ) ) << 16 |
|
||||
static_cast<boost::uint32_t>( static_cast<unsigned char>( 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<boost::uint32_t>( static_cast<unsigned char>( first[0] ) ) |
|
||||
0x0100u;
|
||||
|
||||
break;
|
||||
|
||||
case 2:
|
||||
|
||||
w =
|
||||
static_cast<boost::uint32_t>( static_cast<unsigned char>( first[0] ) ) |
|
||||
static_cast<boost::uint32_t>( static_cast<unsigned char>( first[1] ) ) << 8 |
|
||||
0x010000u;
|
||||
|
||||
break;
|
||||
|
||||
case 3:
|
||||
|
||||
w =
|
||||
static_cast<boost::uint32_t>( static_cast<unsigned char>( first[0] ) ) |
|
||||
static_cast<boost::uint32_t>( static_cast<unsigned char>( first[1] ) ) << 8 |
|
||||
static_cast<boost::uint32_t>( static_cast<unsigned char>( 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
|
|
@ -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 <boost/container_hash/hash.hpp>
|
||||
#include <boost_custom/container_hash/hash_fwd_32.hpp>
|
||||
#include <boost_custom/container_hash/detail/hash_mix_32.hpp>
|
||||
#include <boost_custom/container_hash/detail/hash_range_32.hpp>
|
||||
#include <boost_custom/container_hash/version.hpp>
|
||||
|
||||
#if !BOOST_VERSION_HAS_HASH_RANGE
|
||||
#include <boost/type_traits/is_unsigned.hpp>
|
||||
#include <boost/type_traits/make_unsigned.hpp>
|
||||
|
||||
#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<class T,
|
||||
bool bigger_than_size_t = (sizeof(T) > sizeof(uint32_t)),
|
||||
bool is_unsigned = BOOST_IS_UNSIGNED<T>::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<class T, bool is_unsigned, std::size_t size_t_bits, std::size_t type_bits> struct hash_integral_impl_32<T, false, is_unsigned, size_t_bits, type_bits>
|
||||
{
|
||||
static uint32_t fn( T v )
|
||||
{
|
||||
return static_cast<uint32_t>( v );
|
||||
}
|
||||
};
|
||||
|
||||
template<class T, std::size_t size_t_bits, std::size_t type_bits> struct hash_integral_impl_32<T, true, false, size_t_bits, type_bits>
|
||||
{
|
||||
static uint32_t fn( T v )
|
||||
{
|
||||
typedef typename BOOST_MAKE_UNSIGNED<T>::type U;
|
||||
|
||||
if( v >= 0 )
|
||||
{
|
||||
return hash_integral_impl_32<U>::fn( static_cast<U>( v ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
return ~hash_integral_impl_32<U>::fn( static_cast<U>( ~static_cast<U>( v ) ) );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<class T> struct hash_integral_impl_32<T, true, true, 32, 64>
|
||||
{
|
||||
static uint32_t fn( T v )
|
||||
{
|
||||
uint32_t seed = 0;
|
||||
|
||||
seed = static_cast<uint32_t>( v >> 32 ) + hash_detail::hash_mix_32( seed );
|
||||
seed = static_cast<uint32_t>( v ) + hash_detail::hash_mix_32( seed );
|
||||
|
||||
return seed;
|
||||
}
|
||||
};
|
||||
|
||||
template<class T> struct hash_integral_impl_32<T, true, true, 32, 128>
|
||||
{
|
||||
static uint32_t fn( T v )
|
||||
{
|
||||
uint32_t seed = 0;
|
||||
|
||||
seed = static_cast<uint32_t>( v >> 96 ) + hash_detail::hash_mix_32( seed );
|
||||
seed = static_cast<uint32_t>( v >> 64 ) + hash_detail::hash_mix_32( seed );
|
||||
seed = static_cast<uint32_t>( v >> 32 ) + hash_detail::hash_mix_32( seed );
|
||||
seed = static_cast<uint32_t>( v ) + hash_detail::hash_mix_32( seed );
|
||||
|
||||
return seed;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace hash_detail
|
||||
|
||||
template <typename T>
|
||||
typename BOOST_ENABLE_IF<BOOST_IS_INTEGRAL<T>::value, uint32_t>::type
|
||||
hash_value_32( T v )
|
||||
{
|
||||
return hash_detail::hash_integral_impl_32<T>::fn( v );
|
||||
}
|
||||
|
||||
// contiguous ranges (string, vector, array)
|
||||
#if BOOST_VERSION_HAS_HASH_RANGE
|
||||
template <typename T>
|
||||
typename BOOST_ENABLE_IF<container_hash::is_contiguous_range<T>::value, uint32_t>::type
|
||||
hash_value_32( T const& v )
|
||||
{
|
||||
return boost::hash_range_32( v.data(), v.data() + v.size() );
|
||||
}
|
||||
#else
|
||||
template <class Ch, class A>
|
||||
inline uint32_t hash_value_32(
|
||||
std::basic_string<Ch, std::BOOST_HASH_CHAR_TRAITS<Ch>, A> const& v)
|
||||
{
|
||||
return boost::hash_range_32( v.data(), v.data() + v.size() );
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
// boost::hash_combine
|
||||
//
|
||||
|
||||
template <class T>
|
||||
inline void hash_combine_32( uint32_t& seed, T const& v )
|
||||
{
|
||||
seed = boost::hash_detail::hash_mix_32( seed + 0x9e3779b9 + boost::hash_32<T>()( v ) );
|
||||
}
|
||||
|
||||
//
|
||||
// boost::hash_range
|
||||
//
|
||||
|
||||
template <class It>
|
||||
inline void hash_range_32( uint32_t& seed, It first, It last )
|
||||
{
|
||||
seed = hash_detail::hash_range_32( seed, first, last );
|
||||
}
|
||||
|
||||
template <class It>
|
||||
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 <class T> 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
|
|
@ -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 <boost/container_hash/hash_fwd.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
|
||||
namespace container_hash
|
||||
{
|
||||
|
||||
} // namespace container_hash
|
||||
|
||||
template<class T> struct hash_32;
|
||||
|
||||
template<class T> void hash_combine_32( uint32_t& seed, T const& v );
|
||||
|
||||
template<class It> void hash_range_32( uint32_t&, It, It );
|
||||
template<class It> uint32_t hash_range_32( It, It );
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // #ifndef BOOST_FUNCTIONAL_HASH_FWD_32_HPP
|
|
@ -1,11 +0,0 @@
|
|||
|
||||
#ifndef BOOST_CONTAINER_HASH_VERSION_HPP
|
||||
#define BOOST_CONTAINER_HASH_VERSION_HPP
|
||||
|
||||
#include <boost/version.hpp>
|
||||
|
||||
#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
|
|
@ -12,7 +12,6 @@ extern "C"
|
|||
|
||||
#include "luslog.h"
|
||||
#include <soh/Enhancements/item-tables/ItemTableTypes.h>
|
||||
#include <soh/Enhancements/randomizer/randomizer_inf.h>
|
||||
|
||||
#if defined(INCLUDE_GAME_PRINTF) && defined(_DEBUG)
|
||||
#define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, ##__VA_ARGS__)
|
||||
|
|
|
@ -1339,9 +1339,9 @@ typedef struct {
|
|||
/* */ char* frenchAge;
|
||||
} BetterSceneSelectAgeLabels;
|
||||
|
||||
// NTSC TODO: japanese bettersceneselect
|
||||
|
||||
typedef struct {
|
||||
// /* */ char* japaneseName;
|
||||
/* */ char* japaneseName;
|
||||
/* */ char* englishName;
|
||||
/* */ char* germanName;
|
||||
/* */ char* frenchName;
|
||||
|
@ -1350,7 +1350,7 @@ typedef struct {
|
|||
} BetterSceneSelectEntrancePair;
|
||||
|
||||
typedef struct {
|
||||
// /* */ char* japaneseName;
|
||||
/* */ char* japaneseName;
|
||||
/* */ char* englishName;
|
||||
/* */ char* germanName;
|
||||
/* */ char* frenchName;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
#ifndef Z64_AUDIO_H
|
||||
#define Z64_AUDIO_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <endianness.h>
|
||||
|
||||
#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);
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
47
soh/soh/Enhancements/BootToDebugWarpScreen.cpp
Normal file
47
soh/soh/Enhancements/BootToDebugWarpScreen.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include <libultraship/bridge.h>
|
||||
#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 });
|
23
soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp
Normal file
23
soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include <libultraship/bridge.h>
|
||||
#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 });
|
17
soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp
Normal file
17
soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp
Normal file
|
@ -0,0 +1,17 @@
|
|||
#include <libultraship/bridge.h>
|
||||
#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 });
|
18
soh/soh/Enhancements/CuccosToReturn.cpp
Normal file
18
soh/soh/Enhancements/CuccosToReturn.cpp
Normal file
|
@ -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") });
|
42
soh/soh/Enhancements/ExtraModes/RupeeDash.cpp
Normal file
42
soh/soh/Enhancements/ExtraModes/RupeeDash.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
#include <libultraship/bridge.h>
|
||||
#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 });
|
|
@ -11,7 +11,7 @@ std::array<std::string, LANGUAGE_MAX> RandomizerSettingsMenuText[RSM_MAX] = {
|
|||
// English
|
||||
"Start Randomizer",
|
||||
// German
|
||||
"Start Randomizer",
|
||||
"Randomizer starten",
|
||||
// French
|
||||
"Commencer le Randomizer",
|
||||
},
|
||||
|
@ -19,7 +19,7 @@ std::array<std::string, LANGUAGE_MAX> 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<std::string, LANGUAGE_MAX> RandomizerSettingsMenuText[RSM_MAX] = {
|
|||
// English
|
||||
"Open Randomizer Settings",
|
||||
// German
|
||||
"Open Randomizer Settings",
|
||||
"Randomizer Optionen öffnen",
|
||||
// French
|
||||
"Ouvrir les paramètres du Randomizer",
|
||||
},
|
||||
|
@ -35,7 +35,7 @@ std::array<std::string, LANGUAGE_MAX> RandomizerSettingsMenuText[RSM_MAX] = {
|
|||
// English
|
||||
"Generating...",
|
||||
// German
|
||||
"Generating...",
|
||||
"Generiere...",
|
||||
// French
|
||||
"Génération en cours...",
|
||||
},
|
||||
|
@ -47,11 +47,11 @@ std::array<std::string, LANGUAGE_MAX> RandomizerSettingsMenuText[RSM_MAX] = {
|
|||
",\nor drop a spoiler log on the game window.",
|
||||
#endif
|
||||
// German
|
||||
"No randomizer seed loaded.\nPlease generate one first"
|
||||
"Kein Randomizer Seed gefunden.\nBitte generiere zuerst einen"
|
||||
#if defined(__WIIU__) || defined(__SWITCH__)
|
||||
".",
|
||||
#else
|
||||
",\nor drop a spoiler log on the game window.",
|
||||
",\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\""
|
||||
|
|
|
@ -110,6 +110,7 @@ void applyPreset(std::string presetName, std::vector<PresetSection> includeSecti
|
|||
}
|
||||
}
|
||||
}
|
||||
ShipInit::InitAll();
|
||||
}
|
||||
|
||||
void DrawPresetSelector(std::vector<PresetSection> includeSections, std::string presetLoc, bool disabled) {
|
||||
|
@ -193,23 +194,22 @@ void ParsePreset(nlohmann::json& json, std::string name) {
|
|||
}
|
||||
|
||||
void LoadPresets() {
|
||||
if (!fs::exists(presetFolder)) {
|
||||
return;
|
||||
}
|
||||
if (!presets.empty()) {
|
||||
presets.clear();
|
||||
}
|
||||
for (auto const& preset : fs::directory_iterator(presetFolder)) {
|
||||
std::ifstream ifs(preset.path());
|
||||
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());
|
||||
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();
|
||||
}
|
||||
ifs.close();
|
||||
}
|
||||
auto initData = std::make_shared<Ship::ResourceInitData>();
|
||||
initData->Format = RESOURCE_FORMAT_BINARY;
|
||||
|
|
25
soh/soh/Enhancements/RebottleBlueFire.cpp
Normal file
25
soh/soh/Enhancements/RebottleBlueFire.cpp
Normal file
|
@ -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") });
|
|
@ -0,0 +1,170 @@
|
|||
#include "public/bridge/consolevariablebridge.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor.h"
|
||||
#include "soh/ShipInit.hpp"
|
||||
|
||||
#include <vector>
|
||||
#include <spdlog/spdlog.h>
|
||||
|
||||
#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<WeirdAnimation> 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<const char*> animationName;
|
||||
|
||||
if (ResourceMgr_OTRSigCheck(reinterpret_cast<char*>(animation)) != 0) {
|
||||
animationName = reinterpret_cast<const char*>(animation);
|
||||
animation = reinterpret_cast<LinkAnimationHeader*>(ResourceMgr_LoadAnimByName(*animationName));
|
||||
}
|
||||
|
||||
const auto playerAnimHeader =
|
||||
static_cast<LinkAnimationHeader*>(SEGMENTED_TO_VIRTUAL(static_cast<void*>(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 : "<null>", frame);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static RegisterShipInitFunc initFunc(RegisterN64WeirdFrames, { CVAR_NAME });
|
|
@ -0,0 +1,65 @@
|
|||
#include "WeirdAnimation.h"
|
||||
|
||||
#include "resource/ResourceManager.h"
|
||||
#include "Context.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <spdlog/spdlog.h>
|
||||
|
||||
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<int>(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<int>(direction));
|
||||
assert(false);
|
||||
return "???";
|
||||
}
|
||||
}();
|
||||
|
||||
SPDLOG_DEBUG("Weird animation built for \"{}\": frameCount = {}, direction = {}", targetAnimation, frameCount,
|
||||
directionStr);
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
#pragma once
|
||||
|
||||
#include <libultraship/libultra/types.h>
|
||||
|
||||
#include <cstddef>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
enum class IndexDirection {
|
||||
BACKWARD,
|
||||
FORWARD,
|
||||
};
|
||||
|
||||
class WeirdAnimation {
|
||||
public:
|
||||
WeirdAnimation(std::string targetAnimation, s32 limbCount, IndexDirection direction,
|
||||
std::vector<std::string> 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<std::string> neighborAnimations;
|
||||
|
||||
std::optional<std::vector<std::byte>> animationData;
|
||||
|
||||
void Build();
|
||||
};
|
8
soh/soh/Enhancements/SkipAmyPuzzle.cpp
Normal file
8
soh/soh/Enhancements/SkipAmyPuzzle.cpp
Normal file
|
@ -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") });
|
29
soh/soh/Enhancements/SwitchTimerMultiplier.cpp
Normal file
29
soh/soh/Enhancements/SwitchTimerMultiplier.cpp
Normal file
|
@ -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") });
|
|
@ -1,7 +1,5 @@
|
|||
#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"
|
||||
|
@ -12,29 +10,29 @@ 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, {
|
||||
COND_VB_SHOULD(VB_PLAY_THROW_ANIMATION, CVAR_BLOCKLIFT_VALUE, {
|
||||
Player* player = GET_PLAYER(gPlayState);
|
||||
Actor* interactRangeActor = player->interactRangeActor;
|
||||
s32 interactActorId = interactRangeActor->id;
|
||||
|
@ -42,18 +40,17 @@ void FasterHeavyBlockLift_Register() {
|
|||
|
||||
// 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)) {
|
||||
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 });
|
||||
|
|
35
soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp
Normal file
35
soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp
Normal file
|
@ -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 });
|
|
@ -1,7 +1,5 @@
|
|||
#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"
|
||||
|
@ -12,11 +10,8 @@ extern PlayState* gPlayState;
|
|||
extern SaveContext gSaveContext;
|
||||
}
|
||||
|
||||
void FasterRupeeAccumulator_Register() {
|
||||
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnInterfaceUpdate>([]() {
|
||||
if (!CVarGetInteger(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 0))
|
||||
return;
|
||||
|
||||
void RegisterFasterRupeeAccumulator() {
|
||||
COND_HOOK(OnInterfaceUpdate, CVarGetInteger(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 0), []() {
|
||||
if (gSaveContext.rupeeAccumulator == 0) {
|
||||
return;
|
||||
}
|
||||
|
@ -46,3 +41,5 @@ void FasterRupeeAccumulator_Register() {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
static RegisterShipInitFunc initFunc(RegisterFasterRupeeAccumulator, { CVAR_ENHANCEMENT("FasterRupeeAccumulator") });
|
||||
|
|
26
soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp
Normal file
26
soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp
Normal file
|
@ -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") });
|
|
@ -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" });
|
||||
|
|
|
@ -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,124 +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) {
|
||||
// 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
|
||||
*/
|
||||
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
|
||||
|
||||
/**
|
||||
|
@ -150,35 +35,143 @@ void EnKo_MoveWhenReady(EnKo* enKo, PlayState* play) {
|
|||
void SkipBlueWarp_OnActorUpdate(void* actorPtr) {
|
||||
EnKo* enKo = static_cast<EnKo*>(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<GameInteractor::OnActorUpdate>(ACTOR_EN_KO,
|
||||
SkipBlueWarp_OnActorUpdate);
|
||||
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnVanillaBehavior>(
|
||||
VB_PLAY_TRANSITION_CS, SkipBlueWarp_ShouldPlayTransitionCS);
|
||||
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnVanillaBehavior>(
|
||||
VB_PLAY_BLUE_WARP_CS, SkipBlueWarp_ShouldPlayBlueWarpCS);
|
||||
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnVanillaBehavior>(
|
||||
VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, SkipBlueWarp_ShouldDekuJrConsiderForestTempleFinished);
|
||||
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnVanillaBehavior>(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);
|
||||
|
|
|
@ -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 "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h"
|
||||
|
@ -9,15 +8,17 @@ extern "C" {
|
|||
/**
|
||||
* 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" });
|
||||
|
|
|
@ -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/ShipInit.hpp"
|
||||
|
||||
extern "C" {
|
||||
#include "z64save.h"
|
||||
|
@ -9,21 +9,19 @@ 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.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
*should = false;
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -32,11 +30,11 @@ void SkipLostWoodsBridge_Register() {
|
|||
* 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;
|
||||
}
|
||||
});
|
||||
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" });
|
||||
|
|
|
@ -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 "src/overlays/actors/ovl_En_Zl4/z_en_zl4.h"
|
||||
|
@ -33,16 +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<EnZl4*>(actorPtr);
|
||||
if (enZl4->actionFunc != EnZl4_Cutscene || enZl4->csState != 0)
|
||||
return;
|
||||
EnZl4* enZl4 = static_cast<EnZl4*>(actorPtr);
|
||||
if (enZl4->actionFunc != EnZl4_Cutscene || enZl4->csState != 0)
|
||||
return;
|
||||
|
||||
enZl4->actionFunc = EnZl4_SkipToGivingZeldasLetter;
|
||||
}
|
||||
enZl4->actionFunc = EnZl4_SkipToGivingZeldasLetter;
|
||||
}
|
||||
|
||||
void SkipToGivingZeldasLetter_Register() {
|
||||
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnActorInit>(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" });
|
||||
|
|
|
@ -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 "z64save.h"
|
||||
|
@ -8,18 +7,6 @@ extern "C" {
|
|||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* When this cutscene is skipped, walking up to the bridge to castle town triggers a quick fade in/out
|
||||
* which can be confusing to beginners, because they need to then fetch the Ocarina of Time from the water.
|
||||
|
@ -46,7 +33,7 @@ void SkipZeldaFleeingCastle_OnActorUpdate(void* actorPtr) {
|
|||
void SkipZeldaFleeingCastle_OnActorInit(void* actorPtr) {
|
||||
Actor* actor = static_cast<Actor*>(actorPtr);
|
||||
|
||||
if (actor->params == 3 && CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) {
|
||||
if (actor->params == 3) {
|
||||
framesSinceSpawn = 0;
|
||||
itemOcarinaUpdateHook = GameInteractor::Instance->RegisterGameHookForPtr<GameInteractor::OnActorUpdate>(
|
||||
(uintptr_t)actorPtr, SkipZeldaFleeingCastle_OnActorUpdate);
|
||||
|
@ -59,9 +46,20 @@ void SkipZeldaFleeingCastle_OnActorInit(void* actorPtr) {
|
|||
}
|
||||
}
|
||||
|
||||
void SkipZeldaFleeingCastle_Register() {
|
||||
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnActorInit>(ACTOR_ITEM_OCARINA,
|
||||
SkipZeldaFleeingCastle_OnActorInit);
|
||||
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnVanillaBehavior>(
|
||||
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" });
|
||||
|
|
|
@ -1,28 +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<BgBdanObjects*>(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<GameInteractor::OnActorInit>(
|
||||
ACTOR_BG_BDAN_OBJECTS, [](void* actorRef) {
|
||||
Player* player = GET_PLAYER(gPlayState);
|
||||
BgBdanObjects* bgBdanObjects = static_cast<BgBdanObjects*>(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" });
|
||||
|
|
|
@ -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 "z64save.h"
|
||||
|
@ -15,14 +14,17 @@ 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" });
|
||||
|
|
|
@ -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,93 +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<EnRu1*>(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;
|
||||
}
|
||||
|
||||
if (*should) {
|
||||
Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_WANTS_TO_BE_TOSSED_TO_SAPPHIRE);
|
||||
*should = false;
|
||||
}
|
||||
});
|
||||
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;
|
||||
}
|
||||
});
|
||||
|
||||
// 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*);
|
||||
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*);
|
||||
|
||||
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);
|
||||
// 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 (*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;
|
||||
}
|
||||
});
|
||||
|
||||
// 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<GameInteractor::OnActorInit>(ACTOR_EN_RU1, [](void* actorRef) {
|
||||
EnRu1* enRu1 = static_cast<EnRu1*>(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);
|
||||
}
|
||||
});
|
||||
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" });
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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
|
31
soh/soh/Enhancements/TreesDropSticks.cpp
Normal file
31
soh/soh/Enhancements/TreesDropSticks.cpp
Normal file
|
@ -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") });
|
20
soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp
Normal file
20
soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp
Normal file
|
@ -0,0 +1,20 @@
|
|||
#include <libultraship/bridge.h>
|
||||
#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 });
|
|
@ -623,6 +623,29 @@ void CustomMessage::InsertNumber(uint8_t num) {
|
|||
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) {
|
||||
(str)[0] = std::toupper((str)[0]);
|
||||
|
|
|
@ -153,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,
|
||||
|
|
|
@ -163,6 +163,7 @@ typedef enum {
|
|||
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,
|
||||
|
|
|
@ -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
|
||||
|
@ -1450,6 +1451,55 @@ static bool SfxHandler(std::shared_ptr<Ship::Console> Console, const std::vector
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool AvailableChecksProcessUndiscoveredExitsHandler(std::shared_ptr<Ship::Console> Console,
|
||||
const std::vector<std::string>& 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<Ship::Console> Console,
|
||||
const std::vector<std::string>& args, std::string* output) {
|
||||
RandomizerRegion startingRegion = RR_ROOT;
|
||||
|
||||
if (args.size() > 1) {
|
||||
try {
|
||||
startingRegion = static_cast<RandomizerRegion>(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." });
|
||||
|
@ -1708,5 +1758,15 @@ void DebugConsole_Init(void) {
|
|||
{ "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();
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue