From e9dd4e4fb8ad02a6c4cff4e9bc5acb92b8db9430 Mon Sep 17 00:00:00 2001 From: Waterdish Date: Sun, 25 Aug 2024 13:20:37 -0700 Subject: [PATCH] Macready Golf --- app/build.gradle | 4 +- app/jni/CMakeLists.txt | 4 +- app/jni/src/CMake/Packaging-2.cmake | 3 +- app/jni/src/CMakeLists.txt | 16 +- app/jni/src/OTRExporter/OTRExporter/Main.cpp | 20 +- app/jni/src/docs/BUILDING.md | 9 + app/jni/src/docs/GAME_CONTROLLER_DB.md | 31 ++ app/jni/src/libultraship | 2 +- app/jni/src/scripts/linux/appimage/soh.sh.in | 203 +++++++++++++ app/jni/src/soh/SHIPOFHARKINIAN.manifest | 6 + .../scenes/shared/syotes_scene/syotes_room_0 | Bin 0 -> 211 bytes .../container_hash/detail/hash_range_32.hpp | 15 +- .../boost_custom/container_hash/hash_32.hpp | 24 +- .../boost_custom/container_hash/version.hpp | 2 + app/jni/src/soh/include/functions.h | 4 + app/jni/src/soh/include/z64.h | 2 + app/jni/src/soh/properties.h | 10 +- .../Enhancements/debugger/debugSaveEditor.cpp | 2 +- app/jni/src/soh/soh/Enhancements/presets.h | 2 + .../Enhancements/randomizer/3drando/fill.cpp | 4 +- .../randomizer/randomizer_check_tracker.cpp | 70 +++-- .../randomizer/randomizer_check_tracker.h | 2 + .../randomizer/randomizer_item_tracker.cpp | 53 ++-- app/jni/src/soh/soh/OTRGlobals.cpp | 24 +- app/jni/src/soh/soh/OTRGlobals.h | 1 + app/jni/src/soh/soh/SohGui.cpp | 1 - app/jni/src/soh/soh/SohMenuBar.cpp | 102 ++++--- app/jni/src/soh/soh/SohMenuBar.h | 2 +- app/jni/src/soh/soh/UIWidgets.cpp | 16 +- app/jni/src/soh/soh/UIWidgets.hpp | 4 +- app/jni/src/soh/soh/mixer.c | 8 +- .../src/soh/soh/resource/type/Skeleton.cpp | 7 +- app/jni/src/soh/src/code/game.c | 2 +- app/jni/src/soh/src/code/gfxprint.c | 2 +- app/jni/src/soh/src/code/z_actor.c | 137 +++++++-- app/jni/src/soh/src/code/z_bgcheck.c | 2 +- app/jni/src/soh/src/code/z_message_PAL.c | 2 +- app/jni/src/soh/src/code/z_parameter.c | 278 +++++++++++------- app/jni/src/soh/src/code/z_player_lib.c | 2 + app/jni/src/soh/src/code/z_skelanime.c | 28 ++ .../actors/ovl_Boss_Dodongo/z_boss_dodongo.c | 17 +- .../actors/ovl_Boss_Goma/z_boss_goma.c | 36 ++- .../actors/ovl_Door_Warp1/z_door_warp1.c | 4 +- .../overlays/actors/ovl_En_Bili/z_en_bili.c | 2 +- .../src/overlays/actors/ovl_En_Box/z_en_box.c | 4 +- .../src/overlays/actors/ovl_En_Bw/z_en_bw.c | 4 +- .../overlays/actors/ovl_En_Eiyer/z_en_eiyer.c | 4 +- .../src/overlays/actors/ovl_En_Elf/z_en_elf.c | 2 +- .../actors/ovl_En_Firefly/z_en_firefly.c | 7 +- .../actors/ovl_En_Partner/z_en_partner.c | 2 +- .../actors/ovl_En_Po_Desert/z_en_po_desert.c | 2 +- .../actors/ovl_En_Po_Field/z_en_po_field.c | 5 +- .../ovl_En_Po_Sisters/z_en_po_sisters.c | 8 +- .../src/overlays/actors/ovl_En_Poh/z_en_poh.c | 4 +- .../overlays/actors/ovl_En_Vali/z_en_vali.c | 2 +- .../actors/ovl_En_Weiyer/z_en_weiyer.c | 6 +- .../actors/ovl_En_Wood02/z_en_wood02.c | 13 +- .../src/overlays/actors/ovl_En_Zf/z_en_zf.c | 4 +- .../overlays/actors/ovl_Obj_Mure/z_obj_mure.c | 16 +- .../actors/ovl_Obj_Mure2/z_obj_mure2.c | 24 +- .../actors/ovl_player_actor/z_player.c | 4 - .../ovl_file_choose/z_file_nameset_PAL.c | 1 + .../misc/ovl_kaleido_scope/z_kaleido_item.c | 4 +- app/src/main/AndroidManifest.xml | 4 +- app/src/main/assets/soh.otr | Bin 439361 -> 439364 bytes 65 files changed, 953 insertions(+), 332 deletions(-) create mode 100644 app/jni/src/docs/GAME_CONTROLLER_DB.md create mode 100644 app/jni/src/scripts/linux/appimage/soh.sh.in create mode 100644 app/jni/src/soh/assets/custom/scenes/shared/syotes_scene/syotes_room_0 diff --git a/app/build.gradle b/app/build.gradle index a33e0c3..826d34c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { } minSdkVersion 18 targetSdkVersion 31 - versionCode 5 - versionName "1.2.1" + versionCode 6 + versionName "1.2.2" externalNativeBuild { //ndkBuild { // arguments "APP_PLATFORM=android-23" diff --git a/app/jni/CMakeLists.txt b/app/jni/CMakeLists.txt index 4d28364..db8db17 100644 --- a/app/jni/CMakeLists.txt +++ b/app/jni/CMakeLists.txt @@ -5,8 +5,8 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 ") -project(Game VERSION 8.0.5 LANGUAGES C CXX) -set(PROJECT_BUILD_NAME "MacReady Foxtrot" CACHE STRING "") +project(Game VERSION 8.0.6 LANGUAGES C CXX) +set(PROJECT_BUILD_NAME "MacReady Golf" CACHE STRING "") set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "") add_subdirectory(src) diff --git a/app/jni/src/CMake/Packaging-2.cmake b/app/jni/src/CMake/Packaging-2.cmake index 3525ae1..38fcc59 100644 --- a/app/jni/src/CMake/Packaging-2.cmake +++ b/app/jni/src/CMake/Packaging-2.cmake @@ -24,7 +24,6 @@ if (CPACK_GENERATOR MATCHES "Bundle") set(CPACK_BUNDLE_NAME "soh") set(CPACK_BUNDLE_PLIST "macosx/Info.plist") set(CPACK_BUNDLE_ICON "macosx/soh.icns") - set(CPACK_BUNDLE_STARTUP_COMMAND "../soh/macosx/soh-macos.sh") + set(CPACK_BUNDLE_STARTUP_COMMAND "macosx/soh-macos.sh") set(CPACK_BUNDLE_APPLE_CERT_APP "-") endif() - diff --git a/app/jni/src/CMakeLists.txt b/app/jni/src/CMakeLists.txt index 72d0eb6..4849067 100644 --- a/app/jni/src/CMakeLists.txt +++ b/app/jni/src/CMakeLists.txt @@ -5,9 +5,9 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") -project(Ship VERSION 8.0.5 LANGUAGES C CXX) -set(PROJECT_BUILD_NAME "MacReady Foxtrot" CACHE STRING "") -set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "") +project(Ship VERSION 8.0.6 LANGUAGES C CXX) +set(PROJECT_BUILD_NAME "MacReady Golf" CACHE STRING "" FORCE) +set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "" FORCE) set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh) add_compile_options($<$:/MP>) @@ -117,6 +117,16 @@ install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt" DEST install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT ship) endif() +if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") +file(COPY "${CMAKE_SOURCE_DIR}/src/soh/assets/extractor/" DESTINATION "${CMAKE_SOURCE_DIR}/../src/main/assets/assets/extractor") +file(COPY "${CMAKE_SOURCE_DIR}/src/soh/assets/xml/" DESTINATION "${CMAKE_SOURCE_DIR}/../src/main/assets/assets/extractor/xmls") +file(COPY "${CMAKE_SOURCE_DIR}/src/OTRExporter/CFG/filelists/" DESTINATION "${CMAKE_SOURCE_DIR}/../src/main/assets/assets/extractor/filelists") +file(COPY "${CMAKE_SOURCE_DIR}/src/OTRExporter/CFG/ActorList_OoTMqDbg.txt" DESTINATION "${CMAKE_SOURCE_DIR}/../src/main/assets/assets/extractor/symbols") +file(COPY "${CMAKE_SOURCE_DIR}/src/OTRExporter/CFG/ObjectList_OoTMqDbg.txt" DESTINATION "${CMAKE_SOURCE_DIR}/../src/main/assets/assets/extractor/symbols") +file(COPY "${CMAKE_SOURCE_DIR}/src/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt" DESTINATION "${CMAKE_SOURCE_DIR}/../src/main/assets/assets/extractor/symbols") +endif() + + find_package(Python3 COMPONENTS Interpreter) # Target to generate OTRs diff --git a/app/jni/src/OTRExporter/OTRExporter/Main.cpp b/app/jni/src/OTRExporter/OTRExporter/Main.cpp index b6a09cb..4fc3c48 100644 --- a/app/jni/src/OTRExporter/OTRExporter/Main.cpp +++ b/app/jni/src/OTRExporter/OTRExporter/Main.cpp @@ -174,15 +174,18 @@ static void ExporterProgramEnd() for (const auto& item : lst) { - std::vector splitPath = StringHelper::Split(item, "."); + size_t filenameSepAt = item.find_last_of("/\\"); + const std::string filename = item.substr(filenameSepAt + 1); - if (splitPath.size() >= 3) + if (std::count(filename.begin(), filename.end(), '.') >= 2) { - const std::string extension = splitPath.at(splitPath.size() - 1); - const std::string format = splitPath.at(splitPath.size() - 2); - splitPath.pop_back(); - splitPath.pop_back(); - std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string("")); + size_t extensionSepAt = filename.find_last_of("."); + size_t formatSepAt = filename.find_last_of(".", extensionSepAt - 1); + + const std::string extension = filename.substr(extensionSepAt + 1); + const std::string format = filename.substr(formatSepAt + 1, extensionSepAt - formatSepAt - 1); + std::string afterPath = item.substr(0, filenameSepAt + formatSepAt + 1); + if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8")) { ZTexture tex(nullptr); @@ -208,8 +211,7 @@ static void ExporterProgramEnd() if (item.find("accessibility") != std::string::npos) { - std::string extension = splitPath.at(splitPath.size() - 1); - splitPath.pop_back(); + std::string extension = filename.substr(filename.find_last_of(".") + 1); if (extension == "json") { const auto &fileData = DiskFile::ReadAllBytes(item); diff --git a/app/jni/src/docs/BUILDING.md b/app/jni/src/docs/BUILDING.md index d6d0610..56ff971 100644 --- a/app/jni/src/docs/BUILDING.md +++ b/app/jni/src/docs/BUILDING.md @@ -48,6 +48,9 @@ cd Shipwright # If you need to regenerate the asset headers to check them into source & 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64 --target ExtractAssetHeaders + +# If you need a newer soh.otr only +& 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64 --target GenerateSohOtr ``` ### Developing SoH @@ -110,6 +113,9 @@ cmake --build build-cmake --target clean # If you need to regenerate the asset headers to check them into source cmake --build build-cmake --target ExtractAssetHeaders + +# If you need a newer soh.otr only +cmake --build build-cmake --target GenerateSohOtr ``` ### Generating a distributable @@ -157,6 +163,9 @@ cmake --build build-cmake --target clean # If you need to regenerate the asset headers to check them into source cmake --build build-cmake --target ExtractAssetHeaders + +# If you need a newer soh.otr only +cmake --build build-cmake --target GenerateSohOtr ``` ### Generating a distributable diff --git a/app/jni/src/docs/GAME_CONTROLLER_DB.md b/app/jni/src/docs/GAME_CONTROLLER_DB.md new file mode 100644 index 0000000..4728c89 --- /dev/null +++ b/app/jni/src/docs/GAME_CONTROLLER_DB.md @@ -0,0 +1,31 @@ +# SDL GameControllerDB + +The Ship of Harkinian utilizes a text file with SDL controller mappings for extended controller hardware support. +This file is pulled from https://github.com/gabomdq/SDL_GameControllerDB during the build process as [a part of CMakeLists.txt](https://github.com/HarbourMasters/Shipwright/blob/bb643661f62865dfc757c185d0daaebb32f2d53d/soh/CMakeLists.txt#L760). + +## Released versions + +| Release | sha | diff | +| - | - | - | +| Zhora Alfa 4.0.0 | [967daa8](https://github.com/gabomdq/SDL_GameControllerDB/tree/967daa8f89c48b01ed0f9c6a86ac849930442fc6) | | +| Zhora Bravo 4.0.1 | [ccac7cd](https://github.com/gabomdq/SDL_GameControllerDB/tree/ccac7cd97f445955d4437e21c5f82123d9b4349b) | [+1](https://github.com/gabomdq/SDL_GameControllerDB/compare/967daa8...ccac7cd) | +| Zhora Charlie 4.0.2 | [ff26eb0](https://github.com/gabomdq/SDL_GameControllerDB/tree/ff26eb04d0fe18356985d968119429d6012e7d75) | [+8/-3](https://github.com/gabomdq/SDL_GameControllerDB/compare/ccac7cd...ff26eb0) | +| Zhora Delta 4.0.3 | [ad02da5](https://github.com/gabomdq/SDL_GameControllerDB/tree/ad02da5a95ca8005f2c1facc11a5a52f8522f0ee) | [+4/-5](https://github.com/gabomdq/SDL_GameControllerDB/compare/ff26eb0...ad02da5) | +| Zohra Echo 4.0.4 | [c203690](https://github.com/gabomdq/SDL_GameControllerDB/tree/c203690b1e13980699802918d362cd9dadf89bd0) | [+8/-4](https://github.com/gabomdq/SDL_GameControllerDB/compare/ad02da5...c203690) | +| Zhora Foxtrot 4.0.5 | [9db8101](https://github.com/gabomdq/SDL_GameControllerDB/tree/9db8101a5780d1b0721bf6de385e6ffe0d07dfc7) | [+6](https://github.com/gabomdq/SDL_GameControllerDB/compare/c203690...9db8101) | +| Flynn Alfa 5.0.0 | [163cc5d](https://github.com/gabomdq/SDL_GameControllerDB/tree/163cc5d45e9fc2f1bb2b95ea7eee4bbc9a57955c) | [+29/-8](https://github.com/gabomdq/SDL_GameControllerDB/compare/9db8101...163cc5d) | +| Flynn Bravo 5.0.1 | [7efce7d](https://github.com/gabomdq/SDL_GameControllerDB/tree/7efce7d3f309ec1fa409b1af09153f9eb77fbedf) | [-1](https://github.com/gabomdq/SDL_GameControllerDB/compare/163cc5d...7efce7d) | +| Flynn Charlie 5.0.2 | [e607703](https://github.com/gabomdq/SDL_GameControllerDB/tree/e607703392145343e8aca42be052121c0b7bd1c9) | [+40/-17](https://github.com/gabomdq/SDL_GameControllerDB/compare/7efce7d...e607703) | +| Bradley Alfa 5.1.0 | [2ba9676](https://github.com/gabomdq/SDL_GameControllerDB/tree/2ba96761af795c15e916cc97790b51e09dc0cd54) | [+1/-1](https://github.com/gabomdq/SDL_GameControllerDB/compare/e607703...2ba9676) | +| Bradley Charlie 5.1.2 | [4f5d1d4](https://github.com/gabomdq/SDL_GameControllerDB/tree/4f5d1d497985b75f4a83a5de46f596dc4d7f002e) | [+5/-1](https://github.com/gabomdq/SDL_GameControllerDB/compare/2ba9676...4f5d1d4) | +| Bradley Delta 5.1.3 | [9b73049](https://github.com/gabomdq/SDL_GameControllerDB/tree/9b73049ee62a2cc862d6ad94c2c777f2e8363a48) | [+4/-1](https://github.com/gabomdq/SDL_GameControllerDB/compare/4f5d1d4...9b73049) | +| Bradley Echo 5.1.4 | [6d3801f](https://github.com/gabomdq/SDL_GameControllerDB/tree/6d3801fcfe74b1989de96403b7b560eba72a175c) | [+56/-21](https://github.com/gabomdq/SDL_GameControllerDB/compare/9b73049...6d3801f) | +| Gibbs Alfa 6.0.0 | [0562b00](https://github.com/gabomdq/SDL_GameControllerDB/tree/0562b00eaf5c0308c49d329b79263d2dae1c3a85) | [+8/-2](https://github.com/gabomdq/SDL_GameControllerDB/compare/6d3801f...0562b00) | +| Khan Alfa 6.1.0 | [436c7e3](https://github.com/gabomdq/SDL_GameControllerDB/tree/436c7e3d54a57189ea0ab44d05f36b7cc7ea496c) | [+31/-16](https://github.com/gabomdq/SDL_GameControllerDB/compare/0562b00...436c7e3) | +| Khan Bravo 6.1.1 | [01cca2e](https://github.com/gabomdq/SDL_GameControllerDB/tree/01cca2e77f9bf9f1432be04f876f287eb78297fe) | [+23/-6](https://github.com/gabomdq/SDL_GameControllerDB/compare/436c7e3...01cca2e) | +| Khan Charlie 6.1.2 | [6852946](https://github.com/gabomdq/SDL_GameControllerDB/tree/6852946487534c69b7d228fd4eb8c87cf6966475) | [+25/-15](https://github.com/gabomdq/SDL_GameControllerDB/compare/01cca2e...6852946) | +| Spock Alfa 7.0.0 | [38bda81](https://github.com/gabomdq/SDL_GameControllerDB/tree/38bda816dc786f18493876f7bc30bc12dfd2636a) | [+15/-1](https://github.com/gabomdq/SDL_GameControllerDB/compare/6852946...38bda81) | +| Spock Bravo 7.0.1 | [228d980](https://github.com/gabomdq/SDL_GameControllerDB/tree/228d980d3d791e9df3b096472f6b97459f8709fe) | [+7/-3](https://github.com/gabomdq/SDL_GameControllerDB/compare/38bda81...228d980) | +| Spock Charlie 7.0.2 | [c5b4df0](https://github.com/gabomdq/SDL_GameControllerDB/tree/c5b4df0e1061175cb11e3ebbf8045178339864a5) | [+3](https://github.com/gabomdq/SDL_GameControllerDB/compare/228d980...c5b4df0) | +| Sulu Alfa 7.1.0 | [a2cf171](https://github.com/gabomdq/SDL_GameControllerDB/tree/a2cf1711b4ebc646a3814705d2fb6aac5707bcae) | [+4/-1](https://github.com/gabomdq/SDL_GameControllerDB/compare/c5b4df0...a2cf171) | +| Sulu Bravo 7.1.1 | [cc9f777](https://github.com/gabomdq/SDL_GameControllerDB/tree/cc9f777721f0cb30058d9eef52a295130b734a4a) | [+29/-9](https://github.com/gabomdq/SDL_GameControllerDB/compare/a2cf171...cc9f777) | diff --git a/app/jni/src/libultraship b/app/jni/src/libultraship index f56885c..bc9c4cd 160000 --- a/app/jni/src/libultraship +++ b/app/jni/src/libultraship @@ -1 +1 @@ -Subproject commit f56885cad59319376eadcf6a8e4a2f189d0b763c +Subproject commit bc9c4cdee7e14d814c4616ff36c68634987e00f9 diff --git a/app/jni/src/scripts/linux/appimage/soh.sh.in b/app/jni/src/scripts/linux/appimage/soh.sh.in new file mode 100644 index 0000000..bfc3cfe --- /dev/null +++ b/app/jni/src/scripts/linux/appimage/soh.sh.in @@ -0,0 +1,203 @@ +#!/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 ]]; then + export ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)" + ln -s "$HERE"/usr/bin/{assets,soh.elf,ZAPD} "$ASSETDIR" + export OLDPWD="$PWD" + mkdir -p "$ASSETDIR"/tmp + ln -s "$romfile" "$ASSETDIR"/tmp/rom.z64 + cd "$ASSETDIR" + ROMHASH=$(sha1sum -b "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }') + + # Remap v64 and n64 hashes to their z64 hash equivalent + # ZAPD will handle converting the data into z64 format + case "$ROMHASH" in + a9059b56e761c9034fbe02fe4c24985aaa835dac) # v64 + ROMHASH=cee6bc3c2a634b41728f2af8da54d9bf8cc14099 + ;; + 24708102dc504d3f375a37f4ae4e149c167dc515) # n64 + ROMHASH=cee6bc3c2a634b41728f2af8da54d9bf8cc14099 + ;; + 580dd0bd1b6d2c51cc20a764eece84dba558964c) # v64 + ROMHASH=0227d7c0074f2d0ac935631990da8ec5914597b4 + ;; + d6342c59007e57c1194661ec6880b2f078403f4e) # n64 + ROMHASH=0227d7c0074f2d0ac935631990da8ec5914597b4 + ;; + d0bdc2eb320668b4ba6893b9aefe4040a73123ff) # v64 + ROMHASH=328a1f1beba30ce5e178f031662019eb32c5f3b5 + ;; + 4946ab250f6ac9b32d76b21f309ebb8ebc8103d2) # n64 + ROMHASH=328a1f1beba30ce5e178f031662019eb32c5f3b5 + ;; + 663c34f1b2c05a09e5beffe4d0dcd440f7d49dc7) # v64 + ROMHASH=cfbb98d392e4a9d39da8285d10cbef3974c2f012 + ;; + 24c73d378b0620a380ce5ef9f2b186c6c157a68b) # n64 + ROMHASH=cfbb98d392e4a9d39da8285d10cbef3974c2f012 + ;; + 8ebf2e29313f44f2d49e5b4191971d09919e8e48) # v64 + ROMHASH=f46239439f59a2a594ef83cf68ef65043b1bffe2 + ;; + 4264bf7b875737b8fae77d52322a5099d051fc11) # n64 + ROMHASH=f46239439f59a2a594ef83cf68ef65043b1bffe2 + ;; + 973bc6fe56010a8d646166a1182a81b4f13b8cf9) # v64 + ROMHASH=50bebedad9e0f10746a52b07239e47fa6c284d03 + ;; + d327752c46edc70ff3668b9514083dbbee08927c) # v64 + ROMHASH=50bebedad9e0f10746a52b07239e47fa6c284d03 + ;; + ecdeb1747560834e079c22243febea7f6f26ba3b) # v64 + ROMHASH=079b855b943d6ad8bd1eb026c0ed169ecbdac7da + ;; + f19f8662ec7abee29484a272a6fda53e39efe0f1) # n64 + ROMHASH=079b855b943d6ad8bd1eb026c0ed169ecbdac7da + ;; + ab519ce04a33818ce2c39b3c514a751d807a494a) # v64 + ROMHASH=cfecfdc58d650e71a200c81f033de4e6d617a9f6 + ;; + c19a34f7646305e1755249fca2071e178bd7cd00) # n64 + ROMHASH=cfecfdc58d650e71a200c81f033de4e6d617a9f6 + ;; + 25e8ae79ea0839ca5c984473f7460d8040c36f9c) # v64 + ROMHASH=517bd9714c73cb96c21e7c2ef640d7b55186102f + ;; + 166c02770d67fcc3954c443eb400a6a3573d3fc0) # n64 + ROMHASH=517bd9714c73cb96c21e7c2ef640d7b55186102f + ;; + esac + + case "$ROMHASH" in + cee6bc3c2a634b41728f2af8da54d9bf8cc14099) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=GC_NMQ_D + OTRNAME="oot.otr" + fi + ;; + 0227d7c0074f2d0ac935631990da8ec5914597b4) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=GC_NMQ_PAL_F + OTRNAME="oot.otr" + else + continue + fi + ;; + 328a1f1beba30ce5e178f031662019eb32c5f3b5) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=N64_PAL_10 + OTRNAME="oot.otr" + else + continue + fi + ;; + cfbb98d392e4a9d39da8285d10cbef3974c2f012) + if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then + ROM=N64_PAL_11 + OTRNAME="oot.otr" + else + continue + fi + ;; + f46239439f59a2a594ef83cf68ef65043b1bffe2) + if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then + ROM=GC_MQ_PAL_F + OTRNAME="oot-mq.otr" + else + continue + fi + ;; + 50bebedad9e0f10746a52b07239e47fa6c284d03) + if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then + ROM=GC_MQ_D + OTRNAME="oot-mq.otr" + else + continue + fi + ;; + 079b855b943d6ad8bd1eb026c0ed169ecbdac7da) + if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then + ROM=GC_MQ_D + OTRNAME="oot-mq.otr" + else + continue + fi + ;; + cfecfdc58d650e71a200c81f033de4e6d617a9f6) + if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then + ROM=GC_MQ_D + OTRNAME="oot-mq.otr" + else + continue + fi + ;; + 517bd9714c73cb96c21e7c2ef640d7b55186102f) + if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then + ROM=GC_MQ_D + OTRNAME="oot-mq.otr" + else + continue + fi + ;; + *) + echo -e "\n$romfile - $ROMHASH rom hash does not match\n" + continue;; + esac + if [[ ! -e "$SHIP_HOME"/"$OTRNAME" ]]; then + if [ -n "$ZENITY" ]; then + (echo "# 25%"; echo "25"; sleep 2; echo "# 50%"; echo "50"; sleep 3; echo "# 75%"; echo "75"; sleep 2; echo "# 100%"; echo "100"; sleep 3) | + zenity --progress --title="OTR Generating..." --timeout=10 --percentage=0 --icon-name=soh --window-icon=soh.png --height=80 --width=400 & + else + echo "Processing..." + fi + assets/extractor/ZAPD.out ed -eh -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR --otrfile "${OTRNAME}" --portVer "@CMAKE_PROJECT_VERSION@" > /dev/null 2>&1 + cp "$ASSETDIR"/"$OTRNAME" "$SHIP_HOME" + fi + else + if [[ (! -e "$SHIP_HOME"/oot.otr) && (! -e "$SHIP_HOME"/oot-mq.otr) ]]; then + if [ -n "$ZENITY" ]; then + zenity --error --timeout=5 --text="Place ROM in $SHIP_HOME" --title="Missing ROM file" --width=500 --width=200 + else + echo -e "\nPlace ROM in this folder\n" + fi + exit + fi + fi + done + if [[ (! -e "$SHIP_HOME"/oot.otr) && (! -e "$SHIP_HOME"/oot-mq.otr) ]]; then + if [ -n "$ZENITY" ]; then + zenity --error --timeout=10 --text="No valid ROMs were provided, No OTR was generated." --title="Incorrect ROM file" --width=500 --width=200 + else + echo "No valid roms provided, no OTR was generated." + fi + rm -r "$ASSETDIR" + exit + else + (cd "$SHIP_BIN_DIR"; ./soh.elf) + exit + fi + rm -r "$ASSETDIR" +done + (cd "$SHIP_BIN_DIR"; ./soh.elf) +exit diff --git a/app/jni/src/soh/SHIPOFHARKINIAN.manifest b/app/jni/src/soh/SHIPOFHARKINIAN.manifest index 80d9f60..6f47a93 100644 --- a/app/jni/src/soh/SHIPOFHARKINIAN.manifest +++ b/app/jni/src/soh/SHIPOFHARKINIAN.manifest @@ -28,4 +28,10 @@ + + + true/pm + permonitorv2,permonitor + + diff --git a/app/jni/src/soh/assets/custom/scenes/shared/syotes_scene/syotes_room_0 b/app/jni/src/soh/assets/custom/scenes/shared/syotes_scene/syotes_room_0 new file mode 100644 index 0000000000000000000000000000000000000000..4418f7ec4e2847eb7e75fd83e33bbad555cc13b6 GIT binary patch literal 211 zcmZQzU|{g|5Ap}m@As{}2f`pWv6zj4fk6zUm;*#GGB7X*F)%PNG6*m*F#P}jp9>_) zz{p_0z`#(PoSK(fte=;kms_Y`T$x{zS{x4+gK>)T^K;`3TzujU42%t(ElAbl struct is_char_type: public boost::true_type {}; #endif // #if !BOOST_VERSION_HAS_HASH_RANGE +#if BOOST_USE_STD_TYPES +#define BOOST_ENABLE_IF std::enable_if +#define BOOST_IS_SAME std::is_same +#else +#define BOOST_ENABLE_IF boost::enable_if_ +#define BOOST_IS_SAME is_same +#endif + template -inline typename boost::enable_if_< +inline typename BOOST_ENABLE_IF< is_char_type::value_type>::value && - is_same::iterator_category, std::random_access_iterator_tag>::value, + BOOST_IS_SAME::iterator_category, std::random_access_iterator_tag>::value, std::size_t>::type hash_range_32( uint32_t seed, It first, It last ) { @@ -114,4 +122,7 @@ std::size_t>::type } // namespace hash_detail } // namespace boost +#undef BOOST_ENABLE_IF +#undef BOOST_IS_SAME + #endif // #ifndef BOOST_HASH_DETAIL_HASH_RANGE_32_HPP diff --git a/app/jni/src/soh/include/boost_custom/container_hash/hash_32.hpp b/app/jni/src/soh/include/boost_custom/container_hash/hash_32.hpp index 4b955c4..eaf459a 100644 --- a/app/jni/src/soh/include/boost_custom/container_hash/hash_32.hpp +++ b/app/jni/src/soh/include/boost_custom/container_hash/hash_32.hpp @@ -23,6 +23,18 @@ #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 { @@ -36,7 +48,7 @@ namespace boost { template sizeof(uint32_t)), - bool is_unsigned = boost::is_unsigned::value, + bool is_unsigned = BOOST_IS_UNSIGNED::value, std::size_t size_t_bits = sizeof(uint32_t) * CHAR_BIT, std::size_t type_bits = sizeof(T) * CHAR_BIT> struct hash_integral_impl_32; @@ -53,7 +65,7 @@ namespace boost { static uint32_t fn( T v ) { - typedef typename boost::make_unsigned::type U; + typedef typename BOOST_MAKE_UNSIGNED::type U; if( v >= 0 ) { @@ -97,7 +109,7 @@ namespace boost } // namespace hash_detail template - typename boost::enable_if_::value, uint32_t>::type + typename BOOST_ENABLE_IF::value, uint32_t>::type hash_value_32( T v ) { return hash_detail::hash_integral_impl_32::fn( v ); @@ -106,7 +118,7 @@ namespace boost // contiguous ranges (string, vector, array) #if BOOST_VERSION_HAS_HASH_RANGE template - typename boost::enable_if_::value, uint32_t>::type + typename BOOST_ENABLE_IF::value, uint32_t>::type hash_value_32( T const& v ) { return boost::hash_range_32( v.data(), v.data() + v.size() ); @@ -168,5 +180,9 @@ namespace boost } // namespace boost #undef BOOST_HASH_CHAR_TRAITS +#undef BOOST_ENABLE_IF +#undef BOOST_IS_INTEGRAL +#undef BOOST_IS_UNSIGNED +#undef BOOST_MAKE_UNSIGNED #endif // #ifndef BOOST_FUNCTIONAL_HASH_HASH_32_HPP diff --git a/app/jni/src/soh/include/boost_custom/container_hash/version.hpp b/app/jni/src/soh/include/boost_custom/container_hash/version.hpp index 22ad663..3863b50 100644 --- a/app/jni/src/soh/include/boost_custom/container_hash/version.hpp +++ b/app/jni/src/soh/include/boost_custom/container_hash/version.hpp @@ -6,4 +6,6 @@ #define BOOST_VERSION_HAS_HASH_RANGE ((BOOST_VERSION / 100 % 1000) >= 81) +#define BOOST_USE_STD_TYPES ((BOOST_VERSION / 100 % 1000) >= 84) + #endif // #ifndef BOOST_CONTAINER_HASH_VERSION_HPP diff --git a/app/jni/src/soh/include/functions.h b/app/jni/src/soh/include/functions.h index 246c37d..37d7490 100644 --- a/app/jni/src/soh/include/functions.h +++ b/app/jni/src/soh/include/functions.h @@ -1259,6 +1259,8 @@ void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListIndex); void SkelAnime_DrawSkeletonOpa(PlayState* play, SkelAnime* skelAnime, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, void* arg); +Gfx* SkelAnime_DrawSkeleton2(PlayState* play, SkelAnime* skelAnime, OverrideLimbDrawOpa overrideLimbDraw, + PostLimbDrawOpa postLimbDraw, void* arg, Gfx* gfx); void SkelAnime_DrawOpa(PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, void* arg); void SkelAnime_DrawFlexOpa(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dListCount, @@ -2458,6 +2460,8 @@ void Message_DrawText(PlayState* play, Gfx** gfxP); void Interface_CreateQuadVertexGroup(Vtx* vtxList, s32 xStart, s32 yStart, s32 width, s32 height, u8 flippedH); void Interface_RandoRestoreSwordless(void); +s32 Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projectedPos, f32 projectedW, bool* shouldDraw, + bool* shouldUpdate); // #endregion diff --git a/app/jni/src/soh/include/z64.h b/app/jni/src/soh/include/z64.h index f790ddd..be0bcee 100644 --- a/app/jni/src/soh/include/z64.h +++ b/app/jni/src/soh/include/z64.h @@ -1405,6 +1405,8 @@ typedef struct PlayState { /* 0x1242B */ u8 unk_1242B; /* 0x1242C */ SceneTableEntry* loadedScene; /* 0x12430 */ char unk_12430[0xE8]; + // SOH [Custom Models] MTX tracker for flex based skeletons + Mtx** flexLimbOverrideMTX; } PlayState; // size = 0x12518 typedef struct { diff --git a/app/jni/src/soh/properties.h b/app/jni/src/soh/properties.h index b9e6c03..468e3f2 100644 --- a/app/jni/src/soh/properties.h +++ b/app/jni/src/soh/properties.h @@ -1,9 +1,9 @@ -#define VER_FILEVERSION 8, 0, 5, 0 -#define VER_FILEVERSION_STR "8.0.5\0" +#define VER_FILEVERSION 8, 0, 6, 0 +#define VER_FILEVERSION_STR "8.0.6\0" -#define VER_PRODUCTVERSION 8, 0, 5, 0 -#define VER_PRODUCTVERSION_str "8.0.5\0" +#define VER_PRODUCTVERSION 8, 0, 6, 0 +#define VER_PRODUCTVERSION_str "8.0.6\0" #define VER_COMPANYNAME_STR "github.com/harbourmasters\0" #define VER_PRODUCTNAME_STR "Ship of Harkinian\0" @@ -11,4 +11,4 @@ #define VER_INTERNALNAME_STR "soh\0" #define VER_ORIGINALFILENAME_STR "soh.exe\0" -#define VER_FILEDESCRIPTION_STR "Ship of Harkinian - MacReady Echo\0" +#define VER_FILEDESCRIPTION_STR "Ship of Harkinian - MacReady Golf\0" diff --git a/app/jni/src/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/app/jni/src/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 9af4ead..91eab6d 100644 --- a/app/jni/src/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/app/jni/src/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -782,7 +782,7 @@ void DrawFlagTableArray16(const FlagTable& flagTable, uint16_t row, uint16_t& fl ImGui::PopStyleColor(); if (ImGui::IsItemHovered() && hasDescription) { ImGui::BeginTooltip(); - ImGui::Text("%s", UIWidgets::WrappedText(flagTable.flagDescriptions.at(row * 16 + flagIndex), 60)); + ImGui::Text("%s", UIWidgets::WrappedText(flagTable.flagDescriptions.at(row * 16 + flagIndex), 60).c_str()); ImGui::EndTooltip(); } ImGui::PopID(); diff --git a/app/jni/src/soh/soh/Enhancements/presets.h b/app/jni/src/soh/soh/Enhancements/presets.h index cac60cd..eb7c34e 100644 --- a/app/jni/src/soh/soh/Enhancements/presets.h +++ b/app/jni/src/soh/soh/Enhancements/presets.h @@ -211,6 +211,8 @@ const std::vector enhancementsCvars = { "gDisableLOD", "gDisableDrawDistance", "gDisableKokiriDrawDistance", + "gEnhancements.WidescreenActorCulling", + "gEnhancements.ExtendedCullingExcludeGlitchActors", "gLowResMode", "gDrawLineupTick", "gQuickBongoKill", diff --git a/app/jni/src/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/app/jni/src/soh/soh/Enhancements/randomizer/3drando/fill.cpp index f9d3a95..fa20a08 100644 --- a/app/jni/src/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/app/jni/src/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -846,10 +846,10 @@ static void RandomizeDungeonItems() { } if (GerudoKeys.Is(GERUDOKEYS_ANY_DUNGEON)) { - auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY; }); + auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY || i == GERUDO_FORTRESS_KEY_RING; }); AddElementsToPool(anyDungeonItems, gerudoKeys); } else if (GerudoKeys.Is(GERUDOKEYS_OVERWORLD)) { - auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY; }); + auto gerudoKeys = FilterAndEraseFromPool(ItemPool, [](const auto i) { return i == GERUDO_FORTRESS_SMALL_KEY || i == GERUDO_FORTRESS_KEY_RING; }); AddElementsToPool(overworldItems, gerudoKeys); } diff --git a/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index b9ca97a..7c1f99a 100644 --- a/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -103,6 +103,23 @@ std::map DungeonRCAreasBySceneID = { {SCENE_INSIDE_GANONS_CASTLE, RCAREA_GANONS_CASTLE}, }; +// Dungeon entrances with obvious visual differences between MQ and vanilla qualifying as spoiling on sight +std::vector spoilingEntrances = { + 0x0000, // ENTR_DEKU_TREE_0 + 0x0467, // ENTR_DODONGOS_CAVERN_1 + 0x0028, // ENTR_JABU_JABU_0 + 0x0407, // ENTR_JABU_JABU_1 + 0x0169, // ENTR_FOREST_TEMPLE_0 + 0x0165, // ENTR_FIRE_TEMPLE_0 + 0x0175, // ENTR_FIRE_TEMPLE_1 + 0x0423, // ENTR_WATER_TEMPLE_1 + 0x0082, // ENTR_SPIRIT_TEMPLE_0 + 0x02B2, // ENTR_SHADOW_TEMPLE_1 + 0x0088, // ENTR_ICE_CAVERN_0 + 0x0008, // ENTR_GERUDO_TRAINING_GROUNDS_0 + 0x0467 // ENTR_INSIDE_GANONS_CASTLE_0 +}; + std::map> checksByArea; bool areasFullyChecked[RCAREA_INVALID]; u32 areasSpoiled = 0; @@ -263,6 +280,10 @@ void SetCheckCollected(RandomizerCheck rc) { } SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); + if (!IsAreaSpoiled(rcObj.rcArea)) { + SetAreaSpoiled(rcObj.rcArea); + } + doAreaScroll = true; UpdateOrdering(rcObj.rcArea); UpdateInventoryChecks(); @@ -467,9 +488,14 @@ void CheckTrackerLoadGame(int32_t fileNum) { areaChecksGotten[realRcObj.rcArea]++; } } - - if (areaChecksGotten[realRcObj.rcArea] != 0 || RandomizerCheckObjects::AreaIsOverworld(realRcObj.rcArea)) { - areasSpoiled |= (1 << realRcObj.rcArea); + } + for (int i = RCAREA_KOKIRI_FOREST; i < RCAREA_INVALID; i++) { + if (!IsAreaSpoiled(static_cast(i)) && (RandomizerCheckObjects::AreaIsOverworld(static_cast(i)) || !IS_RANDO || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_NONE || + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SELECTION || + (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SET_NUMBER && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12))) { + SetAreaSpoiled(static_cast(i)); } } if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LINKS_POCKET) != RO_LINKS_POCKET_NOTHING && IS_RANDO) { @@ -539,6 +565,9 @@ void CheckTrackerTransition(uint32_t sceneNum) { SetShopSeen(sceneNum, false); break; } + if (!IsAreaSpoiled(currentArea) && (RandomizerCheckObjects::AreaIsOverworld(currentArea) || std::find(spoilingEntrances.begin(), spoilingEntrances.end(), gPlayState->nextEntranceIndex) != spoilingEntrances.end())) { + SetAreaSpoiled(currentArea); + } } void CheckTrackerFrame() { @@ -756,6 +785,7 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { void InitTrackerData(bool isDebug) { TrySetAreas(); + areasSpoiled = 0; for (auto& [rc, rco] : RandomizerCheckObjects::GetAllRCObjects()) { if (rc != RC_UNKNOWN_CHECK && rc != RC_MAX) { DefaultCheckData(rc); @@ -783,6 +813,7 @@ void SaveTrackerData(SaveContext* saveContext, int sectionID, bool gameSave) { SaveManager::Instance->SaveData("hintItem", saveContext->checkTrackerData[i].hintItem); }); }); + SaveManager::Instance->SaveData("areasSpoiled", areasSpoiled); } void SaveFile(SaveContext* saveContext, int sectionID, bool fullSave) { @@ -798,6 +829,7 @@ void LoadFile() { SaveManager::Instance->LoadData("hintItem", gSaveContext.checkTrackerData[i].hintItem); }); }); + SaveManager::Instance->LoadData("areasSpoiled", areasSpoiled); } void Teardown() { @@ -809,6 +841,15 @@ void Teardown() { lastLocationChecked = RC_UNKNOWN_CHECK; } +bool IsAreaSpoiled(RandomizerCheckArea rcArea) { + return areasSpoiled & (1 << rcArea); +} + +void SetAreaSpoiled(RandomizerCheckArea rcArea) { + areasSpoiled |= (1 << rcArea); + SaveManager::Instance->SaveSection(gSaveContext.fileNum, sectionId, true); +} + void UpdateCheck(uint32_t check, RandomizerCheckTrackerData data) { auto area = RandomizerCheckObjects::GetAllRCObjects().find(static_cast(check))->second.rcArea; if ((!gSaveContext.checkTrackerData[check].skipped && data.skipped) || @@ -827,10 +868,6 @@ void UpdateCheck(uint32_t check, RandomizerCheckTrackerData data) { void CheckTrackerWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(400, 540), ImGuiCond_FirstUseEver); - if (!initialized && (gPlayState == nullptr || gSaveContext.fileNum < 0 || gSaveContext.fileNum > 2)) { - return; - } - if (CVarGetInteger("gCheckTrackerWindowType", TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) { if (CVarGetInteger("gCheckTrackerShowOnlyPaused", 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) { return; @@ -851,7 +888,7 @@ void CheckTrackerWindow::DrawElement() { BeginFloatWindows("Check Tracker", mIsVisible, ImGuiWindowFlags_NoScrollbar); - if (!GameInteractor::IsSaveLoaded()) { + if (!GameInteractor::IsSaveLoaded() || !initialized) { ImGui::Text("Waiting for file load..."); //TODO Language EndFloatWindows(); return; @@ -862,8 +899,6 @@ void CheckTrackerWindow::DrawElement() { sceneId = (SceneID)gPlayState->sceneNum; } - areasSpoiled |= (1 << currentArea); - //Quick Options #ifdef __WIIU__ float headerHeight = 40.0f; @@ -925,7 +960,6 @@ void CheckTrackerWindow::DrawElement() { Color_RGBA8 mainColor; Color_RGBA8 extraColor; std::string stemp; - s32 areaMask = 1; for (auto& [rcArea, objs] : checksByArea) { RandomizerCheckArea thisArea = currentArea; @@ -978,11 +1012,7 @@ void CheckTrackerWindow::DrawElement() { ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(extraColor.r / 255.0f, extraColor.g / 255.0f, extraColor.b / 255.0f, extraColor.a / 255.0f)); - isThisAreaSpoiled = areasSpoiled & areaMask || CVarGetInteger("gCheckTrackerOptionMQSpoilers", 0) || !IS_RANDO || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_NONE || - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SELECTION || - (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_RANDOM_MQ_DUNGEONS) == RO_MQ_DUNGEONS_SET_NUMBER && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_MQ_DUNGEON_COUNT) == 12); + isThisAreaSpoiled = IsAreaSpoiled(rcArea) || CVarGetInteger("gCheckTrackerOptionMQSpoilers", 0); if (isThisAreaSpoiled) { if (showVOrMQ && RandomizerCheckObjects::AreaIsDungeon(rcArea)) { @@ -1015,7 +1045,6 @@ void CheckTrackerWindow::DrawElement() { ImGui::TreePop(); } } - areaMask <<= 1; } ImGui::EndTable(); //Checks Lead-out @@ -1219,10 +1248,10 @@ bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj) { } void UpdateInventoryChecks() { - //For all the areas with compasses, if you have one, spoil the area + //For all the areas with maps, if you have one, spoil the area for (auto [scene, area] : DungeonRCAreasBySceneID) { if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, scene)) { - areasSpoiled |= (1 << area); + SetAreaSpoiled(area); } } } @@ -1232,9 +1261,6 @@ void UpdateAreaFullyChecked(RandomizerCheckArea area) { void UpdateAreas(RandomizerCheckArea area) { areasFullyChecked[area] = areaChecksGotten[area] == checksByArea.find(area)->second.size(); - if (areaChecksGotten[area] != 0 || RandomizerCheckObjects::AreaIsOverworld(area)) { - areasSpoiled |= (1 << area); - } } void UpdateAllOrdering() { diff --git a/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index a8928cc..85a4f1d 100644 --- a/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -50,6 +50,8 @@ bool IsVisibleInCheckTracker(RandomizerCheckObject rcObj); void InitTrackerData(bool isDebug); RandomizerCheckArea GetCheckArea(); void UpdateCheck(uint32_t, RandomizerCheckTrackerData); +bool IsAreaSpoiled(RandomizerCheckArea rcArea); +void SetAreaSpoiled(RandomizerCheckArea rcArea); } // namespace CheckTracker diff --git a/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index f63b37b..44671b5 100644 --- a/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/app/jni/src/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -9,6 +9,7 @@ #include #include #include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "randomizer_check_tracker.h" #include extern "C" { @@ -290,15 +291,15 @@ bool IsValidSaveFile() { } bool HasSong(ItemTrackerItem item) { - return (1 << item.id) & gSaveContext.inventory.questItems; + return GameInteractor::IsSaveLoaded() ? ((1 << item.id) & gSaveContext.inventory.questItems) : false; } bool HasQuestItem(ItemTrackerItem item) { - return (item.data & gSaveContext.inventory.questItems) != 0; + return GameInteractor::IsSaveLoaded() ? (item.data & gSaveContext.inventory.questItems) : false; } bool HasEquipment(ItemTrackerItem item) { - return (item.data & gSaveContext.inventory.equipment) != 0; + return GameInteractor::IsSaveLoaded() ? (item.data & gSaveContext.inventory.equipment) : false; } ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) { @@ -406,8 +407,12 @@ ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) { #define IM_COL_GREEN IM_COL32(0, 255, 0, 255) #define IM_COL_GRAY IM_COL32(155, 155, 155, 255) #define IM_COL_PURPLE IM_COL32(180, 90, 200, 255) +#define IM_COL_LIGHT_YELLOW IM_COL32(255, 255, 130, 255) -void DrawItemCount(ItemTrackerItem item) { +void DrawItemCount(ItemTrackerItem item, bool hideMax) { + if (!GameInteractor::IsSaveLoaded()) { + return; + } int iconSize = CVarGetInteger("gItemTrackerIconSize", 36); ItemTrackerNumbers currentAndMax = GetItemCurrentAndMax(item); ImVec2 p = ImGui::GetCursorScreenPos(); @@ -416,7 +421,7 @@ void DrawItemCount(ItemTrackerItem item) { if (item.id == ITEM_KEY_SMALL && IsValidSaveFile()) { std::string currentString = ""; - std::string maxString = std::to_string(currentAndMax.maxCapacity); + std::string maxString = hideMax ? "???" : std::to_string(currentAndMax.maxCapacity); ImU32 currentColor = IM_COL_WHITE; ImU32 maxColor = IM_COL_GREEN; // "Collected / Max", "Current / Collected / Max", "Current / Max" @@ -548,7 +553,7 @@ void DrawQuest(ItemTrackerItem item) { ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); if (item.id == QUEST_SKULL_TOKEN) { - DrawItemCount(item); + DrawItemCount(item, false); } ImGui::EndGroup(); @@ -558,7 +563,7 @@ void DrawQuest(ItemTrackerItem item) { void DrawItem(ItemTrackerItem item) { - uint32_t actualItemId = INV_CONTENT(item.id); + uint32_t actualItemId = GameInteractor::IsSaveLoaded() ? INV_CONTENT(item.id) : ITEM_NONE; int iconSize = CVarGetInteger("gItemTrackerIconSize", 36); bool hasItem = actualItemId != ITEM_NONE; std::string itemName = ""; @@ -617,7 +622,7 @@ void DrawItem(ItemTrackerItem item) { ImGui::Image(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - DrawItemCount(item); + DrawItemCount(item, false); ImGui::EndGroup(); if (itemName == "") { @@ -628,7 +633,7 @@ void DrawItem(ItemTrackerItem item) { } void DrawBottle(ItemTrackerItem item) { - uint32_t actualItemId = gSaveContext.inventory.items[SLOT(item.id) + item.data]; + uint32_t actualItemId = GameInteractor::IsSaveLoaded() ? (gSaveContext.inventory.items[SLOT(item.id) + item.data]) : false; bool hasItem = actualItemId != ITEM_NONE; if (GameInteractor::IsSaveLoaded() && (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { @@ -647,8 +652,8 @@ void DrawDungeonItem(ItemTrackerItem item) { ImU32 dungeonColor = IM_COL_WHITE; uint32_t bitMask = 1 << (item.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential int iconSize = CVarGetInteger("gItemTrackerIconSize", 36); - bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[item.data]) != 0; - bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[item.data]) >= 0; + bool hasItem = GameInteractor::IsSaveLoaded() ? (bitMask & gSaveContext.inventory.dungeonItems[item.data]) : false; + bool hasSmallKey = GameInteractor::IsSaveLoaded() ? ((gSaveContext.inventory.dungeonKeys[item.data]) >= 0) : false; ImGui::BeginGroup(); if (itemId == ITEM_KEY_SMALL) { ImGui::Image(LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), @@ -659,16 +664,18 @@ void DrawDungeonItem(ItemTrackerItem item) { ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } - if (ResourceMgr_IsSceneMasterQuest(item.data) && (CHECK_DUNGEON_ITEM(DUNGEON_MAP, item.data) || item.data == SCENE_GERUDO_TRAINING_GROUND || item.data == SCENE_INSIDE_GANONS_CASTLE)) { - dungeonColor = IM_COL_PURPLE; + if (CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data))) && GameInteractor::IsSaveLoaded()) { + dungeonColor = (ResourceMgr_IsSceneMasterQuest(item.data) ? IM_COL_PURPLE : IM_COL_LIGHT_YELLOW); } if (itemId == ITEM_KEY_SMALL) { - DrawItemCount(item); + DrawItemCount(item, !CheckTracker::IsAreaSpoiled(RandomizerCheckObjects::GetRCAreaBySceneID(static_cast(item.data)))); ImVec2 p = ImGui::GetCursorScreenPos(); + // offset puts the text at the correct level. for some reason, if the save is loaded, the margin is 3 pixels higher only for small keys, so we use 16 then. Otherwise, 13 is where everything else is + int offset = GameInteractor::IsSaveLoaded() ? 16 : 13; std::string dungeonName = itemTrackerDungeonShortNames[item.data]; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 16))); + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + offset))); ImGui::PushStyleColor(ImGuiCol_Text, dungeonColor); ImGui::Text("%s", dungeonName.c_str()); ImGui::PopStyleColor(); @@ -725,13 +732,15 @@ void DrawNotes(bool resizeable = false) { } }; ImVec2 size = resizeable ? ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y) : ImVec2(((iconSize + iconSpacing) * 6) - 8, 200); - if (ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, ImGuiInputTextFlags_AllowTabInput)) { - notesNeedSave = true; - notesIdleFrames = 0; - } - if ((ImGui::IsItemDeactivatedAfterEdit() || (notesNeedSave && notesIdleFrames > notesMaxIdleFrames)) && IsValidSaveFile()) { - notesNeedSave = false; - SaveManager::Instance->SaveSection(gSaveContext.fileNum, itemTrackerSectionId, true); + if (GameInteractor::IsSaveLoaded()) { + if (ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, ImGuiInputTextFlags_AllowTabInput)) { + notesNeedSave = true; + notesIdleFrames = 0; + } + if ((ImGui::IsItemDeactivatedAfterEdit() || (notesNeedSave && notesIdleFrames > notesMaxIdleFrames)) && IsValidSaveFile()) { + notesNeedSave = false; + SaveManager::Instance->SaveSection(gSaveContext.fileNum, itemTrackerSectionId, true); + } } ImGui::EndGroup(); } diff --git a/app/jni/src/soh/soh/OTRGlobals.cpp b/app/jni/src/soh/soh/OTRGlobals.cpp index 64d70da..136cb24 100644 --- a/app/jni/src/soh/soh/OTRGlobals.cpp +++ b/app/jni/src/soh/soh/OTRGlobals.cpp @@ -137,6 +137,8 @@ Color_RGB8 zoraColor = { 0x00, 0xEC, 0x64 }; float previousImGuiScale; +bool prevAltAssets = false; + // Same as NaviColor type from OoT src (z_actor.c), but modified to be sans alpha channel for Controller LED. typedef struct { Color_RGB8 inner; @@ -297,6 +299,8 @@ OTRGlobals::OTRGlobals() { }; // tell LUS to reserve 3 SoH specific threads (Game, Audio, Save) context = LUS::Context::CreateInstance("Ship of Harkinian", appShortName, "shipofharkinian.json", OTRFiles, {}, 3); + prevAltAssets = CVarGetInteger("gAltAssets", 0); + context->GetResourceManager()->SetAltAssetsEnabled(prevAltAssets); SPDLOG_INFO("Starting Ship of Harkinian version {}", (char*)gBuildVersion); context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SOH_Animation, "Animation", std::make_shared()); @@ -1235,7 +1239,7 @@ extern "C" void Graph_StartFrame() { } #endif case KbScancode::LUS_KB_TAB: { - ToggleAltAssetsAtEndOfFrame = true; + CVarSetInteger("gAltAssets", !CVarGetInteger("gAltAssets", 0)); break; } } @@ -1315,11 +1319,10 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) { } } - if (ToggleAltAssetsAtEndOfFrame) { - ToggleAltAssetsAtEndOfFrame = false; - - // Actually update the CVar now before runing the alt asset update listeners - CVarSetInteger("gAltAssets", !CVarGetInteger("gAltAssets", 0)); + bool curAltAssets = CVarGetInteger("gAltAssets", 0); + if (prevAltAssets != curAltAssets) { + prevAltAssets = curAltAssets; + LUS::Context::GetInstance()->GetResourceManager()->SetAltAssetsEnabled(curAltAssets); gfx_texture_cache_clear(); LUS::SkeletonPatcher::UpdateSkeletons(); GameInteractor::Instance->ExecuteHooks(); @@ -1495,10 +1498,14 @@ extern "C" uint8_t ResourceMgr_FileAltExists(const char* filePath) { return ExtensionCache.contains(path); } +extern "C" bool ResourceMgr_IsAltAssetsEnabled() { + return LUS::Context::GetInstance()->GetResourceManager()->IsAltAssetsEnabled(); +} + // Unloads a resource if an alternate version exists when alt assets are enabled // The resource is only removed from the internal cache to prevent it from used in the next resource lookup extern "C" void ResourceMgr_UnloadOriginalWhenAltExists(const char* resName) { - if (CVarGetInteger("gAltAssets", 0) && ResourceMgr_FileAltExists((char*) resName)) { + if (ResourceMgr_IsAltAssetsEnabled() && ResourceMgr_FileAltExists((char*) resName)) { ResourceMgr_UnloadResource((char*) resName); } } @@ -1735,6 +1742,7 @@ extern "C" char* ResourceMgr_LoadArrayByName(const char* path) return (char*)res->Scalars.data(); } +// Return of LoadArrayByNameAsVec3s must be freed by the caller extern "C" char* ResourceMgr_LoadArrayByNameAsVec3s(const char* path) { auto res = std::static_pointer_cast(GetResourceByNameHandlingMQ(path)); @@ -1867,7 +1875,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path, Skel pathStr = pathStr.substr(sOtr.length()); } - bool isAlt = CVarGetInteger("gAltAssets", 0); + bool isAlt = ResourceMgr_IsAltAssetsEnabled(); if (isAlt) { pathStr = LUS::IResource::gAltAssetPrefix + pathStr; diff --git a/app/jni/src/soh/soh/OTRGlobals.h b/app/jni/src/soh/soh/OTRGlobals.h index 469f679..99275db 100644 --- a/app/jni/src/soh/soh/OTRGlobals.h +++ b/app/jni/src/soh/soh/OTRGlobals.h @@ -122,6 +122,7 @@ void Ctx_ReadSaveFile(uintptr_t addr, void* dramAddr, size_t size); void Ctx_WriteSaveFile(uintptr_t addr, void* dramAddr, size_t size); uint64_t GetPerfCounter(); +bool ResourceMgr_IsAltAssetsEnabled(); struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path, SkelAnime* skelAnime); void ResourceMgr_UnregisterSkeleton(SkelAnime* skelAnime); void ResourceMgr_ClearSkeletons(); diff --git a/app/jni/src/soh/soh/SohGui.cpp b/app/jni/src/soh/soh/SohGui.cpp index 8bd7430..cd28c4d 100644 --- a/app/jni/src/soh/soh/SohGui.cpp +++ b/app/jni/src/soh/soh/SohGui.cpp @@ -38,7 +38,6 @@ #include "Enhancements/game-interactor/GameInteractor.h" #include "Enhancements/cosmetics/authenticGfxPatches.h" -bool ToggleAltAssetsAtEndOfFrame = false; bool isBetaQuestEnabled = false; extern "C" { diff --git a/app/jni/src/soh/soh/SohMenuBar.cpp b/app/jni/src/soh/soh/SohMenuBar.cpp index ed7c88b..e0f18fd 100644 --- a/app/jni/src/soh/soh/SohMenuBar.cpp +++ b/app/jni/src/soh/soh/SohMenuBar.cpp @@ -28,7 +28,6 @@ #include "Enhancements/randomizer/randomizer_item_tracker.h" #include "Enhancements/randomizer/randomizer_settings_window.h" -extern bool ToggleAltAssetsAtEndOfFrame; extern bool isBetaQuestEnabled; extern "C" PlayState* gPlayState; @@ -50,6 +49,13 @@ std::string GetWindowButtonText(const char* text, bool menuOpen) { if (!menuOpen) { strcat(buttonText, " "); } return buttonText; } + +static std::unordered_map windowBackendNames = { + { LUS::WindowBackend::DX11, "DirectX" }, + { LUS::WindowBackend::SDL_OPENGL, "OpenGL"}, + { LUS::WindowBackend::SDL_METAL, "Metal" }, + { LUS::WindowBackend::GX2, "GX2"} +}; static const char* imguiScaleOptions[4] = { "Small", "Normal", "Large", "X-Large" }; @@ -102,6 +108,24 @@ extern "C" SaveContext gSaveContext; namespace SohGui { +std::unordered_map availableWindowBackendsMap; +LUS::WindowBackend configWindowBackend; + +void UpdateWindowBackendObjects() { + LUS::WindowBackend runningWindowBackend = LUS::Context::GetInstance()->GetWindow()->GetWindowBackend(); + int32_t configWindowBackendId = LUS::Context::GetInstance()->GetConfig()->GetInt("Window.Backend.Id", -1); + if (configWindowBackendId != -1 && configWindowBackendId < static_cast(LUS::WindowBackend::BACKEND_COUNT)) { + configWindowBackend = static_cast(configWindowBackendId); + } else { + configWindowBackend = runningWindowBackend; + } + + auto availableWindowBackends = LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends(); + for (auto& backend : *availableWindowBackends) { + availableWindowBackendsMap[backend] = windowBackendNames[backend]; + } +} + void DrawMenuBarIcon() { static bool gameIconLoaded = false; if (!gameIconLoaded) { @@ -395,40 +419,24 @@ void DrawSettingsMenu() { UIWidgets::Tooltip("Changes the scaling of the ImGui menu elements."); UIWidgets::PaddedSeparator(true, true, 3.0f, 3.0f); - - static std::unordered_map windowBackendNames = { - { LUS::WindowBackend::DX11, "DirectX" }, - { LUS::WindowBackend::SDL_OPENGL, "OpenGL"}, - { LUS::WindowBackend::SDL_METAL, "Metal" }, - { LUS::WindowBackend::GX2, "GX2"} - }; ImGui::Text("Renderer API (Needs reload)"); - LUS::WindowBackend runningWindowBackend = LUS::Context::GetInstance()->GetWindow()->GetWindowBackend(); - LUS::WindowBackend configWindowBackend; - int configWindowBackendId = LUS::Context::GetInstance()->GetConfig()->GetInt("Window.Backend.Id", -1); - if (configWindowBackendId != -1 && configWindowBackendId < static_cast(LUS::WindowBackend::BACKEND_COUNT)) { - configWindowBackend = static_cast(configWindowBackendId); - } else { - configWindowBackend = runningWindowBackend; - } - if (LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends()->size() <= 1) { + if (availableWindowBackendsMap.size() <= 1) { UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); } - if (ImGui::BeginCombo("##RApi", windowBackendNames[configWindowBackend])) { - for (size_t i = 0; i < LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends()->size(); i++) { - auto backend = LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends()->data()[i]; - if (ImGui::Selectable(windowBackendNames[backend], backend == configWindowBackend)) { - LUS::Context::GetInstance()->GetConfig()->SetInt("Window.Backend.Id", static_cast(backend)); - LUS::Context::GetInstance()->GetConfig()->SetString("Window.Backend.Name", - windowBackendNames[backend]); + if (ImGui::BeginCombo("##RApi", availableWindowBackendsMap[configWindowBackend])) { + for (auto backend : availableWindowBackendsMap) { + if (ImGui::Selectable(backend.second, backend.first == configWindowBackend)) { + LUS::Context::GetInstance()->GetConfig()->SetInt("Window.Backend.Id", static_cast(backend.first)); + LUS::Context::GetInstance()->GetConfig()->SetString("Window.Backend.Name", backend.second); LUS::Context::GetInstance()->GetConfig()->Save(); + UpdateWindowBackendObjects(); } } ImGui::EndCombo(); } - if (LUS::Context::GetInstance()->GetWindow()->GetAvailableWindowBackends()->size() <= 1) { + if (availableWindowBackendsMap.size() <= 1) { UIWidgets::ReEnableComponent(""); } @@ -911,12 +919,7 @@ void DrawEnhancementsMenu() { if (ImGui::BeginMenu("Graphics")) { if (ImGui::BeginMenu("Mods")) { - if (UIWidgets::PaddedEnhancementCheckbox("Use Alternate Assets", "gAltAssets", false, false)) { - // The checkbox will flip the alt asset CVar, but we instead want it to change at the end of the game frame - // We toggle it back while setting the flag to update the CVar later - CVarSetInteger("gAltAssets", !CVarGetInteger("gAltAssets", 0)); - ToggleAltAssetsAtEndOfFrame = true; - } + UIWidgets::PaddedEnhancementCheckbox("Use Alternate Assets", "gAltAssets", false, false); UIWidgets::Tooltip("Toggle between standard assets and alternate assets. Usually mods will indicate if this setting has to be used or not."); UIWidgets::PaddedEnhancementCheckbox("Disable Bomb Billboarding", "gDisableBombBillboarding", true, false); UIWidgets::Tooltip("Disables bombs always rotating to face the camera. To be used in conjunction with mods that want to replace bombs with 3D objects."); @@ -929,16 +932,39 @@ void DrawEnhancementsMenu() { } UIWidgets::PaddedEnhancementCheckbox("Disable LOD", "gDisableLOD", true, false); UIWidgets::Tooltip("Turns off the Level of Detail setting, making models use their higher-poly variants at any distance"); - if (UIWidgets::PaddedEnhancementCheckbox("Disable Draw Distance", "gDisableDrawDistance", true, false)) { - if (CVarGetInteger("gDisableDrawDistance", 0) == 0) { + if (UIWidgets::EnhancementSliderInt("Increase Actor Draw Distance: %dx", "##IncreaseActorDrawDistance", + "gDisableDrawDistance", 1, 5, "", 1, true, false)) { + if (CVarGetInteger("gDisableDrawDistance", 1) <= 1) { CVarSetInteger("gDisableKokiriDrawDistance", 0); } } - UIWidgets::Tooltip("Turns off the objects draw distance, making objects being visible from a longer range"); - if (CVarGetInteger("gDisableDrawDistance", 0) == 1) { + UIWidgets::Tooltip("Increases the range in which actors/objects are drawn"); + if (CVarGetInteger("gDisableDrawDistance", 1) > 1) { UIWidgets::PaddedEnhancementCheckbox("Kokiri Draw Distance", "gDisableKokiriDrawDistance", true, false); - UIWidgets::Tooltip("The Kokiri are mystical beings that fade into view when approached\nEnabling this will remove their draw distance"); + UIWidgets::Tooltip("The Kokiri are mystical beings that fade into view when approached\nEnabling this " + "will remove their draw distance"); } + UIWidgets::PaddedEnhancementCheckbox("Widescreen Actor Culling", "gEnhancements.WidescreenActorCulling", + true, false); + UIWidgets::Tooltip("Adjusts the horizontal culling plane to account for widescreen resolutions"); + UIWidgets::PaddedEnhancementCheckbox( + "Cull Glitch Useful Actors", "gEnhancements.ExtendedCullingExcludeGlitchActors", true, false, + !CVarGetInteger("gEnhancements.WidescreenActorCulling", 0) && + CVarGetInteger("gDisableDrawDistance", 1) <= 1, + "Requires Actor Draw Distance to be increased or Widescreen Actor Culling enabled"); + UIWidgets::Tooltip( + "Exclude actors that are useful for glitches from the extended culling ranges.\n" + "Some actors may still draw in the extended ranges, but will not \"update\" so that certain " + "glitches that leverage the original culling requirements will still work.\n" + "\n" + "The following actors are excluded:\n" + "- White clothed Gerudos\n" + "- King Zora\n" + "- Gossip Stones\n" + "- Boulders\n" + "- Blue Warps\n" + "- Darunia\n" + "- Gold Skulltulas"); UIWidgets::PaddedEnhancementCheckbox("N64 Mode", "gLowResMode", true, false); UIWidgets::Tooltip("Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution"); UIWidgets::PaddedEnhancementCheckbox("Glitch line-up tick", "gDrawLineupTick", true, false); @@ -1614,6 +1640,10 @@ void DrawRandomizerMenu() { } } +void SohMenuBar::InitElement() { + UpdateWindowBackendObjects(); +} + void SohMenuBar::DrawElement() { if (ImGui::BeginMenuBar()) { DrawMenuBarIcon(); diff --git a/app/jni/src/soh/soh/SohMenuBar.h b/app/jni/src/soh/soh/SohMenuBar.h index ce62344..238903f 100644 --- a/app/jni/src/soh/soh/SohMenuBar.h +++ b/app/jni/src/soh/soh/SohMenuBar.h @@ -10,7 +10,7 @@ class SohMenuBar : public LUS::GuiMenuBar { using LUS::GuiMenuBar::GuiMenuBar; protected: void DrawElement() override; - void InitElement() override {}; + void InitElement() override; void UpdateElement() override {}; }; } // namespace SohGui \ No newline at end of file diff --git a/app/jni/src/soh/soh/UIWidgets.cpp b/app/jni/src/soh/soh/UIWidgets.cpp index 15bb088..06eaa33 100644 --- a/app/jni/src/soh/soh/UIWidgets.cpp +++ b/app/jni/src/soh/soh/UIWidgets.cpp @@ -21,7 +21,7 @@ namespace UIWidgets { // Automatically adds newlines to break up text longer than a specified number of characters // Manually included newlines will still be respected and reset the line length // If line is midword when it hits the limit, text should break at the last encountered space - char* WrappedText(const char* text, unsigned int charactersPerLine) { + std::string WrappedText(const char* text, unsigned int charactersPerLine) { std::string newText(text); const size_t tipLength = newText.length(); int lastSpace = -1; @@ -43,17 +43,17 @@ namespace UIWidgets { currentLineLength++; } - return strdup(newText.c_str()); + return newText; } - char* WrappedText(const std::string& text, unsigned int charactersPerLine) { + std::string WrappedText(const std::string& text, unsigned int charactersPerLine) { return WrappedText(text.c_str(), charactersPerLine); } void SetLastItemHoverText(const std::string& text) { if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); - ImGui::Text("%s", WrappedText(text, 60)); + ImGui::Text("%s", WrappedText(text, 60).c_str()); ImGui::EndTooltip(); } } @@ -61,7 +61,7 @@ namespace UIWidgets { void SetLastItemHoverText(const char* text) { if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); - ImGui::Text("%s", WrappedText(text, 60)); + ImGui::Text("%s", WrappedText(text, 60).c_str()); ImGui::EndTooltip(); } } @@ -72,7 +72,7 @@ namespace UIWidgets { ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?"); if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); - ImGui::Text("%s", WrappedText(text, 60)); + ImGui::Text("%s", WrappedText(text, 60).c_str()); ImGui::EndTooltip(); } } @@ -82,7 +82,7 @@ namespace UIWidgets { ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?"); if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); - ImGui::Text("%s", WrappedText(text, 60)); + ImGui::Text("%s", WrappedText(text, 60).c_str()); ImGui::EndTooltip(); } } @@ -92,7 +92,7 @@ namespace UIWidgets { void Tooltip(const char* text) { if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("%s", WrappedText(text)); + ImGui::SetTooltip("%s", WrappedText(text).c_str()); } } diff --git a/app/jni/src/soh/soh/UIWidgets.hpp b/app/jni/src/soh/soh/UIWidgets.hpp index b184879..3c4622b 100644 --- a/app/jni/src/soh/soh/UIWidgets.hpp +++ b/app/jni/src/soh/soh/UIWidgets.hpp @@ -50,8 +50,8 @@ namespace UIWidgets { constexpr float sliderButtonWidth = 30.0f; #endif - char* WrappedText(const char* text, unsigned int charactersPerLine = 60); - char* WrappedText(const std::string& text, unsigned int charactersPerLine); + std::string WrappedText(const char* text, unsigned int charactersPerLine = 60); + std::string WrappedText(const std::string& text, unsigned int charactersPerLine); void SetLastItemHoverText(const std::string& text); void SetLastItemHoverText(const char* text); diff --git a/app/jni/src/soh/soh/mixer.c b/app/jni/src/soh/soh/mixer.c index 2e80ffb..ba6a01b 100644 --- a/app/jni/src/soh/soh/mixer.c +++ b/app/jni/src/soh/soh/mixer.c @@ -99,8 +99,14 @@ void aClearBufferImpl(uint16_t addr, int nbytes) { memset(BUF_U8(addr), 0, nbytes); } -void aLoadBufferImpl(const void *source_addr, uint16_t dest_addr, uint16_t nbytes) { +void aLoadBufferImpl(const void* source_addr, uint16_t dest_addr, uint16_t nbytes) { +#if __SANITIZE_ADDRESS__ + for (size_t i = 0; i < ROUND_DOWN_16(nbytes); i++) { + BUF_U8(dest_addr)[i] = ((const unsigned char*)source_addr)[i]; + } +#else memcpy(BUF_U8(dest_addr), source_addr, ROUND_DOWN_16(nbytes)); +#endif } void aSaveBufferImpl(uint16_t source_addr, int16_t *dest_addr, uint16_t nbytes) { diff --git a/app/jni/src/soh/soh/resource/type/Skeleton.cpp b/app/jni/src/soh/soh/resource/type/Skeleton.cpp index 13798d3..d83f8b9 100644 --- a/app/jni/src/soh/soh/resource/type/Skeleton.cpp +++ b/app/jni/src/soh/soh/resource/type/Skeleton.cpp @@ -65,12 +65,11 @@ void SkeletonPatcher::ClearSkeletons() } void SkeletonPatcher::UpdateSkeletons() { - bool isHD = CVarGetInteger("gAltAssets", 0); + auto resourceMgr = LUS::Context::GetInstance()->GetResourceManager(); + bool isHD = resourceMgr->IsAltAssetsEnabled(); for (auto skel : skeletons) { Skeleton* newSkel = - (Skeleton*)LUS::Context::GetInstance()->GetResourceManager() - ->LoadResource((isHD ? LUS::IResource::gAltAssetPrefix : "") + skel.vanillaSkeletonPath, true) - .get(); + (Skeleton*)resourceMgr->LoadResource((isHD ? LUS::IResource::gAltAssetPrefix : "") + skel.vanillaSkeletonPath, true).get(); if (newSkel != nullptr) { skel.skelAnime->skeleton = newSkel->skeletonData.skeletonHeader.segment; diff --git a/app/jni/src/soh/src/code/game.c b/app/jni/src/soh/src/code/game.c index b46aa4e..46c212b 100644 --- a/app/jni/src/soh/src/code/game.c +++ b/app/jni/src/soh/src/code/game.c @@ -467,7 +467,7 @@ void GameState_Destroy(GameState* gameState) { // Performing clear skeletons before unload resources fixes an actor heap corruption crash due to the skeleton patching system. ResourceMgr_ClearSkeletons(); - if (CVarGetInteger("gAltAssets", 0)) { + if (ResourceMgr_IsAltAssetsEnabled()) { ResourceUnloadDirectory("alt/*"); gfx_texture_cache_clear(); } diff --git a/app/jni/src/soh/src/code/gfxprint.c b/app/jni/src/soh/src/code/gfxprint.c index 8a0dbea..cb33ec5 100644 --- a/app/jni/src/soh/src/code/gfxprint.c +++ b/app/jni/src/soh/src/code/gfxprint.c @@ -141,7 +141,7 @@ static const ALIGN_ASSET(2) char rGfxPrintFontDataAlt[] = drGfxPrintFontDataAlt; // https://github.com/HarbourMasters/Shipwright/issues/2762 typedef enum {hardcoded, otrDefault, otrAlt} font_texture_t; font_texture_t GfxPrint_TextureToUse() { - if (CVarGetInteger("gAltAssets", 0) && ResourceMgr_FileExists(rGfxPrintFontDataAlt)) { + if (ResourceMgr_IsAltAssetsEnabled() && ResourceMgr_FileExists(rGfxPrintFontDataAlt)) { // If we have alt assets enabled, and we have alt prefixed font texture, use that return otrAlt; } else if (ResourceMgr_FileExists(rGfxPrintFontData)) { diff --git a/app/jni/src/soh/src/code/z_actor.c b/app/jni/src/soh/src/code/z_actor.c index c1dc66e..3ccb62b 100644 --- a/app/jni/src/soh/src/code/z_actor.c +++ b/app/jni/src/soh/src/code/z_actor.c @@ -1208,19 +1208,11 @@ void Actor_Init(Actor* actor, PlayState* play) { actor->uncullZoneForward = 1000.0f; actor->uncullZoneScale = 350.0f; actor->uncullZoneDownward = 700.0f; - if (CVarGetInteger("gDisableDrawDistance", 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room - && actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence - && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning - && (play->sceneNum != SCENE_DODONGOS_CAVERN && actor->id != ACTOR_EN_ZF)) { // Check for DC and Lizalfos for the case where the miniboss music would still play under certains conditions and changing room - actor->uncullZoneForward = 32767.0f; - actor->uncullZoneScale = 32767.0f; - actor->uncullZoneDownward = 32767.0f; - } CollisionCheck_InitInfo(&actor->colChkInfo); actor->floorBgId = BGCHECK_SCENE; ActorShape_Init(&actor->shape, 0.0f, NULL, 0.0f); if (Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { - //Actor_SetObjectDependency(play, actor); + Actor_SetObjectDependency(play, actor); actor->init(actor, play); actor->init = NULL; @@ -2548,6 +2540,13 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { Actor_SetObjectDependency(play, actor); actor->init(actor, play); actor->init = NULL; + + GameInteractor_ExecuteOnActorInit(actor); + + // For enemy health bar we need to know the max health during init + if (actor->category == ACTORCAT_ENEMY) { + actor->maximumHealth = actor->colChkInfo.health; + } } actor = actor->next; } else if (!Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { @@ -2850,34 +2849,93 @@ s32 func_800314B0(PlayState* play, Actor* actor) { s32 func_800314D4(PlayState* play, Actor* actor, Vec3f* arg2, f32 arg3) { f32 var; - if (CVarGetInteger("gDisableDrawDistance", 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room - && actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence - && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning - && (play->sceneNum != SCENE_DODONGOS_CAVERN && actor->id != ACTOR_EN_ZF)) { // Check for DC and Lizalfos for the case where the miniboss music would still play under certains conditions and changing room - return true; - } - if ((arg2->z > -actor->uncullZoneScale) && (arg2->z < (actor->uncullZoneForward + actor->uncullZoneScale))) { var = (arg3 < 1.0f) ? 1.0f : 1.0f / arg3; - // #region SoH [Widescreen support] - // Doors will cull quite noticeably on wider screens. For these actors the zone is increased - f32 limit = 1.0f; - if (((actor->id == ACTOR_EN_DOOR) || (actor->id == ACTOR_DOOR_SHUTTER)) && CVarGetInteger("gIncreaseDoorUncullZones", 1)) { - limit = 2.0f; - } - - if ((((fabsf(arg2->x) - actor->uncullZoneScale) * var) < limit) && - (((arg2->y + actor->uncullZoneDownward) * var) > -limit) && - (((arg2->y - actor->uncullZoneScale) * var) < limit)) { + if ((((fabsf(arg2->x) - actor->uncullZoneScale) * var) < 1.0f) && + (((arg2->y + actor->uncullZoneDownward) * var) > -1.0f) && + (((arg2->y - actor->uncullZoneScale) * var) < 1.0f)) { return true; } - // #endregion } return false; } +// #region SOH [Enhancements] Allows us to increase the draw and update distance independently, +// mostly a modified version of the function above and additional tweaks for some specfic actors +s32 Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projectedPos, f32 projectedW, bool* shouldDraw, + bool* shouldUpdate) { + f32 clampedProjectedW; + + // Check if the actor passes its original/vanilla culling requirements + if (func_800314D4(play, actor, projectedPos, projectedW)) { + *shouldUpdate = true; + *shouldDraw = true; + return true; + } + + // Skip cutscne actors that depend on culling to hide from camera pans + if (actor->id == ACTOR_EN_VIEWER) { + return false; + } + + s32 multiplier = CVarGetInteger("gDisableDrawDistance", 1); + multiplier = MAX(multiplier, 1); + + // Some actors have a really short forward value, so we need to add to it before the multiplier to increase the + // final strength of the forward culling + f32 adder = (actor->uncullZoneForward < 500) ? 1000.0f : 0.0f; + + if ((projectedPos->z > -actor->uncullZoneScale) && + (projectedPos->z < (((actor->uncullZoneForward + adder) * multiplier) + actor->uncullZoneScale))) { + clampedProjectedW = (projectedW < 1.0f) ? 1.0f : 1.0f / projectedW; + + f32 ratioAdjusted = 1.0f; + + if (CVarGetInteger("gEnhancements.WidescreenActorCulling", 0)) { + f32 originalAspectRatio = 4.0f / 3.0f; + f32 currentAspectRatio = OTRGetAspectRatio(); + ratioAdjusted = MAX(currentAspectRatio / originalAspectRatio, 1.0f); + } + + if ((((fabsf(projectedPos->x) - actor->uncullZoneScale) * (clampedProjectedW / ratioAdjusted)) < 1.0f) && + (((projectedPos->y + actor->uncullZoneDownward) * clampedProjectedW) > -1.0f) && + (((projectedPos->y - actor->uncullZoneScale) * clampedProjectedW) < 1.0f)) { + + if (CVarGetInteger("gEnhancements.ExtendedCullingExcludeGlitchActors", 0)) { + // These actors are safe to draw without impacting glitches + if ((actor->id == ACTOR_OBJ_BOMBIWA || actor->id == ACTOR_OBJ_HAMISHI || + actor->id == ACTOR_EN_ISHI) || // Boulders (hookshot through collision) + actor->id == ACTOR_EN_GS || // Gossip stones (text delay) + actor->id == ACTOR_EN_GE1 || // White gerudos (gate clip/archery room transition) + actor->id == ACTOR_EN_KZ || // King Zora (unfreeze glitch) + actor->id == ACTOR_EN_DU || // Darunia (Fire temple BK skip) + actor->id == ACTOR_DOOR_WARP1 // Blue warps (wrong warps) + ) { + *shouldDraw = true; + return true; + } + + // Skip these actors entirely as their draw funcs impacts glitches + if ((actor->id == ACTOR_EN_SW && + (((actor->params & 0xE000) >> 0xD) == 1 || + ((actor->params & 0xE000) >> 0xD) == 2)) // Gold Skulltulas (hitbox at 0,0) + ) { + return false; + } + } + + *shouldDraw = true; + *shouldUpdate = true; + return true; + } + } + + return false; +} +// #endregion + void func_800315AC(PlayState* play, ActorContext* actorCtx) { s32 invisibleActorCounter; Actor* invisibleActors[INVISIBLE_ACTOR_MAX]; @@ -2913,18 +2971,35 @@ void func_800315AC(PlayState* play, ActorContext* actorCtx) { } } + // #region SOH [Enhancement] Extended culling updates + bool shipShouldDraw = false; + bool shipShouldUpdate = false; if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(70) == 0)) { - if (func_800314B0(play, actor)) { - actor->flags |= ACTOR_FLAG_ACTIVE; + if (CVarGetInteger("gDisableDrawDistance", 1) > 1 || + CVarGetInteger("gEnhancements.WidescreenActorCulling", 0)) { + Ship_CalcShouldDrawAndUpdate(play, actor, &actor->projectedPos, actor->projectedW, &shipShouldDraw, + &shipShouldUpdate); + + if (shipShouldUpdate) { + actor->flags |= ACTOR_FLAG_ACTIVE; + } else { + actor->flags &= ~ACTOR_FLAG_ACTIVE; + } } else { - actor->flags &= ~ACTOR_FLAG_ACTIVE; + if (func_800314B0(play, actor)) { + actor->flags |= ACTOR_FLAG_ACTIVE; + } else { + actor->flags &= ~ACTOR_FLAG_ACTIVE; + } } } actor->isDrawn = false; if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(71) == 0)) { - if ((actor->init == NULL) && (actor->draw != NULL) && (actor->flags & (ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_ACTIVE))) { + if ((actor->init == NULL) && (actor->draw != NULL) && + ((actor->flags & (ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_ACTIVE)) || shipShouldDraw)) { + // #endregion if ((actor->flags & ACTOR_FLAG_LENS) && ((play->roomCtx.curRoom.lensMode == LENS_MODE_HIDE_ACTORS) || play->actorCtx.lensActive || (actor->room != play->roomCtx.curRoom.num))) { diff --git a/app/jni/src/soh/src/code/z_bgcheck.c b/app/jni/src/soh/src/code/z_bgcheck.c index c948b0e..41f45a2 100644 --- a/app/jni/src/soh/src/code/z_bgcheck.c +++ b/app/jni/src/soh/src/code/z_bgcheck.c @@ -398,7 +398,7 @@ s32 CollisionPoly_LineVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* posA, V (poly->normal.x * posB->x + poly->normal.y * posB->y + poly->normal.z * posB->z) * COLPOLY_NORMAL_FRAC + plane.originDist; -#if defined(__WIIU__) || defined(__ANDROID__) +#if defined(__SWITCH__) || defined(__WIIU__) || defined(__ANDROID__) // on some platforms this ends up as very small numbers due to rounding issues if (IS_ZERO(planeDistA)) { planeDistA = 0.0f; diff --git a/app/jni/src/soh/src/code/z_message_PAL.c b/app/jni/src/soh/src/code/z_message_PAL.c index 1196dd7..d2ed406 100644 --- a/app/jni/src/soh/src/code/z_message_PAL.c +++ b/app/jni/src/soh/src/code/z_message_PAL.c @@ -1115,7 +1115,7 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) { } } if (msgCtx->textDelayTimer == 0) { - msgCtx->textDrawPos = i + CVarGetInteger("gTextSpeed", 2); + msgCtx->textDrawPos = i + CVarGetInteger("gTextSpeed", 1); msgCtx->textDelayTimer = msgCtx->textDelay; } else { msgCtx->textDelayTimer--; diff --git a/app/jni/src/soh/src/code/z_parameter.c b/app/jni/src/soh/src/code/z_parameter.c index a4d61f8..449ee28 100644 --- a/app/jni/src/soh/src/code/z_parameter.c +++ b/app/jni/src/soh/src/code/z_parameter.c @@ -1436,64 +1436,62 @@ Gfx* Gfx_TextureI8(Gfx* displayListHead, void* texture, s16 textureWidth, s16 te return displayListHead; } -void Inventory_SwapAgeEquipment(void) { +void Rando_Inventory_SwapAgeEquipment(void) { s16 i; u16 shieldEquipValue; if (LINK_AGE_IN_YEARS == YEARS_CHILD) { - - for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { if (i != 0) { - gSaveContext.childEquips.buttonItems[i] = gSaveContext.equips.buttonItems[i]; + gSaveContext.childEquips.buttonItems[i] = + gSaveContext.equips.buttonItems[i]; } else { gSaveContext.childEquips.buttonItems[i] = ITEM_SWORD_KOKIRI; } if (i != 0) { - gSaveContext.childEquips.cButtonSlots[i - 1] = gSaveContext.equips.cButtonSlots[i - 1]; + gSaveContext.childEquips.cButtonSlots[i - 1] = + gSaveContext.equips.cButtonSlots[i - 1]; } } - // When becoming adult, remove swordless flag since we'll get master sword - // (Unless Master Sword is shuffled) - // Only in rando to keep swordless link bugs in vanilla - if (IS_RANDO && !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { - Flags_UnsetInfTable(INFTABLE_SWORDLESS); - } - gSaveContext.childEquips.equipment = gSaveContext.equips.equipment; - if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE && !(IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && gSaveContext.adultEquips.equipment)) { - if (!IS_RANDO || !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) { - gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; - } else { - gSaveContext.equips.buttonItems[0] = ITEM_NONE; - Flags_SetInfTable(INFTABLE_SWORDLESS); - } + // When becoming adult, remove swordless flag since we'll get master sword + // This gets set back appropriately later in the case of master sword shuffle + Flags_UnsetInfTable(INFTABLE_SWORDLESS); + + // This section sets up the equipment on the first time going adult. + // On master sword shuffle the check for the B button is insufficient, and so checking the equipment is completely zero-ed is needed + // (Could just always use `gSaveContext.adultEquips.equipment == 0` for rando?) + if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE && ((IS_RANDO && !Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD)) || (gSaveContext.adultEquips.equipment == 0))) { + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; if (gSaveContext.inventory.items[SLOT_NUT] != ITEM_NONE) { gSaveContext.equips.buttonItems[1] = ITEM_NUT; gSaveContext.equips.cButtonSlots[0] = SLOT_NUT; } else { - gSaveContext.equips.buttonItems[1] = gSaveContext.equips.cButtonSlots[0] = ITEM_NONE; + gSaveContext.equips.buttonItems[1] = gSaveContext.equips.cButtonSlots[0] = + ITEM_NONE; } gSaveContext.equips.buttonItems[2] = ITEM_BOMB; gSaveContext.equips.buttonItems[3] = gSaveContext.inventory.items[SLOT_OCARINA]; gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB; gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA; - gSaveContext.equips.equipment = (EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4)) | - (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) | - (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | - (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); + (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) | + (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | + (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); + // In Master Sword Shuffle we want to override the equip of the master sword from the vanilla code + // First check we have the Master sword in our inventory, and if not, then unequip if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && - gSaveContext.equips.buttonItems[0] == ITEM_NONE) { + !CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER)) { gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); + gSaveContext.equips.buttonItems[0] = ITEM_NONE; + Flags_SetInfTable(INFTABLE_SWORDLESS); } - // Set the dpad to nothing gSaveContext.equips.buttonItems[4] = ITEM_NONE; gSaveContext.equips.buttonItems[5] = ITEM_NONE; @@ -1505,25 +1503,25 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.equips.cButtonSlots[6] = SLOT_NONE; } else { for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { - gSaveContext.equips.buttonItems[i] = gSaveContext.adultEquips.buttonItems[i]; + gSaveContext.equips.buttonItems[i] = + gSaveContext.adultEquips.buttonItems[i]; if (i != 0) { - gSaveContext.equips.cButtonSlots[i - 1] = gSaveContext.adultEquips.cButtonSlots[i - 1]; + gSaveContext.equips.cButtonSlots[i - 1] = + gSaveContext.adultEquips.cButtonSlots[i - 1]; } if (((gSaveContext.equips.buttonItems[i] >= ITEM_BOTTLE) && (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { - osSyncPrintf("Register_Item_Pt(%d)=%d\n", i, gSaveContext.equips.cButtonSlots[i - 1]); gSaveContext.equips.buttonItems[i] = gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; } } - // In Rando, when switching to adult for the second+ time, if a sword was not previously - // equiped in MS shuffle, then we need to set the swordless flag again - if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && + // In Master Sword Shuffle we want to set the swordless flag if no item is on the B button + if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && gSaveContext.equips.buttonItems[0] == ITEM_NONE) { Flags_SetInfTable(INFTABLE_SWORDLESS); } @@ -1531,90 +1529,43 @@ void Inventory_SwapAgeEquipment(void) { gSaveContext.equips.equipment = gSaveContext.adultEquips.equipment; } } else { - // When becoming child, set swordless flag if player doesn't have kokiri sword - // Only in rando to keep swordless link bugs in vanilla - if (IS_RANDO && CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_KOKIRI) == 0) { - Flags_SetInfTable(INFTABLE_SWORDLESS); - } - - // When using enhancements, set swordless flag if player doesn't have kokiri sword or hasn't equipped a sword yet. - // Then set the child equips button items to item none to ensure kokiri sword is not equipped - if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && (CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_KOKIRI) == 0 || Flags_GetInfTable(INFTABLE_SWORDLESS))) { - Flags_SetInfTable(INFTABLE_SWORDLESS); - gSaveContext.childEquips.buttonItems[0] = ITEM_NONE; - } for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { gSaveContext.adultEquips.buttonItems[i] = gSaveContext.equips.buttonItems[i]; if (i != 0) { - gSaveContext.adultEquips.cButtonSlots[i - 1] = gSaveContext.equips.cButtonSlots[i - 1]; + gSaveContext.adultEquips.cButtonSlots[i - 1] = + gSaveContext.equips.cButtonSlots[i - 1]; } } gSaveContext.adultEquips.equipment = gSaveContext.equips.equipment; - // Switching age using enhancements separated out to make vanilla flow clear - if (CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) { + + if (gSaveContext.childEquips.buttonItems[0] != ITEM_NONE) { for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { - gSaveContext.equips.buttonItems[i] = gSaveContext.childEquips.buttonItems[i]; + gSaveContext.equips.buttonItems[i] = + gSaveContext.childEquips.buttonItems[i]; if (i != 0) { - gSaveContext.equips.cButtonSlots[i - 1] = gSaveContext.childEquips.cButtonSlots[i - 1]; + gSaveContext.equips.cButtonSlots[i - 1] = + gSaveContext.childEquips.cButtonSlots[i - 1]; } if (((gSaveContext.equips.buttonItems[i] >= ITEM_BOTTLE) && (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { - osSyncPrintf("Register_Item_Pt(%d)=%d\n", i, gSaveContext.equips.cButtonSlots[i - 1]); gSaveContext.equips.buttonItems[i] = gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; } } - gSaveContext.equips.equipment = gSaveContext.childEquips.equipment; - gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); - // Equips kokiri sword in the inventory screen only if kokiri sword exists in inventory and a sword has been equipped already - if (!(CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_KOKIRI) == 0) && !Flags_GetInfTable(INFTABLE_SWORDLESS)) { - gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4); - } - } else if (gSaveContext.childEquips.buttonItems[0] != ITEM_NONE) { - for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { - gSaveContext.equips.buttonItems[i] = gSaveContext.childEquips.buttonItems[i]; - - if (i != 0) { - gSaveContext.equips.cButtonSlots[i - 1] = gSaveContext.childEquips.cButtonSlots[i - 1]; - } - - if (((gSaveContext.equips.buttonItems[i] >= ITEM_BOTTLE) && - (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || - ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && - (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { - osSyncPrintf("Register_Item_Pt(%d)=%d\n", i, gSaveContext.equips.cButtonSlots[i - 1]); - gSaveContext.equips.buttonItems[i] = - gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; - } - } - - // In Rando, when switching to child from a swordless adult, and child Link previously had a - // sword equiped, then we need to unset the swordless flag to match - if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && - gSaveContext.equips.buttonItems[0] != ITEM_NONE) { - Flags_UnsetInfTable(INFTABLE_SWORDLESS); - } - gSaveContext.equips.equipment = gSaveContext.childEquips.equipment; gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4); - } else if (IS_RANDO && Randomizer_GetSettingValue(RSK_STARTING_AGE) == RO_AGE_ADULT) { - /*If in rando and starting age is adult, childEquips is not initialized and buttonItems[0] - will be ITEM_NONE. When changing age from adult -> child, reset equips to "default" - (only kokiri tunic/boots equipped, no sword, no C-button items, no D-Pad items). - When becoming child, set swordless flag if player doesn't have kokiri sword - Only in rando to keep swordless link bugs in vanilla*/ - if (CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_KOKIRI) == 0) { - Flags_SetInfTable(INFTABLE_SWORDLESS); - } + } + // In Rando we need an extra case to handle starting as adult. We can use the fact that the childEquips will be uninitialised (i.e. 0) at this point + else if (gSaveContext.childEquips.equipment == 0) { //zero out items for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { @@ -1629,20 +1580,147 @@ void Inventory_SwapAgeEquipment(void) { (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); } - if ((CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) && - (gSaveContext.equips.buttonItems[0] == ITEM_NONE)) { + // When becoming child in rando, set swordless flag and clear B button if player doesn't have kokiri sword + // Otherwise, equip sword and unset flag + if (!CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_KOKIRI)) { + gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); + gSaveContext.equips.buttonItems[0] = ITEM_NONE; Flags_SetInfTable(INFTABLE_SWORDLESS); - if (gSaveContext.childEquips.equipment == 0) { - // force equip kokiri tunic and boots in scenario gSaveContext.childEquips.equipment is uninitialized - gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); - gSaveContext.equips.equipment |= (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | - (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); - } + } else { + gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); + gSaveContext.equips.equipment |= (EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4)); + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KOKIRI; + Flags_UnsetInfTable(INFTABLE_SWORDLESS); } } - CVarSetInteger("gSwitchTimeline", 0); + shieldEquipValue = gEquipMasks[EQUIP_TYPE_SHIELD] & gSaveContext.equips.equipment; - if (shieldEquipValue != 0) { + if (shieldEquipValue) { + shieldEquipValue >>= gEquipShifts[EQUIP_TYPE_SHIELD]; + if (!CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, shieldEquipValue - 1)) { + gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_TYPE_SHIELD]; + } + } +} + +void Inventory_SwapAgeEquipment(void) { + s16 i; + u16 shieldEquipValue; + + // Mod Enhancments can utilise the rando flow path + if (IS_RANDO || CVarGetInteger("gSwitchAge", 0) || CVarGetInteger("gSwitchTimeline", 0)) { + Rando_Inventory_SwapAgeEquipment(); + CVarSetInteger("gSwitchTimeline", 0); + return; + } + + if (LINK_AGE_IN_YEARS == YEARS_CHILD) { + for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { + if (i != 0) { + gSaveContext.childEquips.buttonItems[i] = + gSaveContext.equips.buttonItems[i]; + } else { + gSaveContext.childEquips.buttonItems[i] = ITEM_SWORD_KOKIRI; + } + + if (i != 0) { + gSaveContext.childEquips.cButtonSlots[i - 1] = + gSaveContext.equips.cButtonSlots[i - 1]; + } + } + + gSaveContext.childEquips.equipment = gSaveContext.equips.equipment; + + if (gSaveContext.adultEquips.buttonItems[0] == ITEM_NONE) { + gSaveContext.equips.buttonItems[0] = ITEM_SWORD_MASTER; + + if (gSaveContext.inventory.items[SLOT_NUT] != ITEM_NONE) { + gSaveContext.equips.buttonItems[1] = ITEM_NUT; + gSaveContext.equips.cButtonSlots[0] = SLOT_NUT; + } else { + gSaveContext.equips.buttonItems[1] = gSaveContext.equips.cButtonSlots[0] = + ITEM_NONE; + } + + gSaveContext.equips.buttonItems[2] = ITEM_BOMB; + gSaveContext.equips.buttonItems[3] = gSaveContext.inventory.items[SLOT_OCARINA]; + gSaveContext.equips.cButtonSlots[1] = SLOT_BOMB; + gSaveContext.equips.cButtonSlots[2] = SLOT_OCARINA; + gSaveContext.equips.equipment = (EQUIP_VALUE_SWORD_MASTER << (EQUIP_TYPE_SWORD * 4)) | + (EQUIP_VALUE_SHIELD_HYLIAN << (EQUIP_TYPE_SHIELD * 4)) | + (EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4)) | + (EQUIP_VALUE_BOOTS_KOKIRI << (EQUIP_TYPE_BOOTS * 4)); + // Set the dpad to nothing + gSaveContext.equips.buttonItems[4] = ITEM_NONE; + gSaveContext.equips.buttonItems[5] = ITEM_NONE; + gSaveContext.equips.buttonItems[6] = ITEM_NONE; + gSaveContext.equips.buttonItems[7] = ITEM_NONE; + gSaveContext.equips.cButtonSlots[3] = SLOT_NONE; + gSaveContext.equips.cButtonSlots[4] = SLOT_NONE; + gSaveContext.equips.cButtonSlots[5] = SLOT_NONE; + gSaveContext.equips.cButtonSlots[6] = SLOT_NONE; + } else { + for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { + gSaveContext.equips.buttonItems[i] = + gSaveContext.adultEquips.buttonItems[i]; + + if (i != 0) { + gSaveContext.equips.cButtonSlots[i - 1] = + gSaveContext.adultEquips.cButtonSlots[i - 1]; + } + + if (((gSaveContext.equips.buttonItems[i] >= ITEM_BOTTLE) && + (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || + ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && + (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { + osSyncPrintf("Register_Item_Pt(%d)=%d\n", i, gSaveContext.equips.cButtonSlots[i - 1]); + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } + } + + gSaveContext.equips.equipment = gSaveContext.adultEquips.equipment; + } + } else { + for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { + gSaveContext.adultEquips.buttonItems[i] = gSaveContext.equips.buttonItems[i]; + + if (i != 0) { + gSaveContext.adultEquips.cButtonSlots[i - 1] = + gSaveContext.equips.cButtonSlots[i - 1]; + } + } + + gSaveContext.adultEquips.equipment = gSaveContext.equips.equipment; + + if (gSaveContext.childEquips.buttonItems[0] != ITEM_NONE) { + for (i = 0; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { + gSaveContext.equips.buttonItems[i] = + gSaveContext.childEquips.buttonItems[i]; + + if (i != 0) { + gSaveContext.equips.cButtonSlots[i - 1] = + gSaveContext.childEquips.cButtonSlots[i - 1]; + } + + if (((gSaveContext.equips.buttonItems[i] >= ITEM_BOTTLE) && + (gSaveContext.equips.buttonItems[i] <= ITEM_POE)) || + ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) && + (gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK))) { + osSyncPrintf("Register_Item_Pt(%d)=%d\n", i, gSaveContext.equips.cButtonSlots[i - 1]); + gSaveContext.equips.buttonItems[i] = + gSaveContext.inventory.items[gSaveContext.equips.cButtonSlots[i - 1]]; + } + } + + gSaveContext.equips.equipment = gSaveContext.childEquips.equipment; + gSaveContext.equips.equipment &= (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)); + gSaveContext.equips.equipment |= EQUIP_VALUE_SWORD_KOKIRI << (EQUIP_TYPE_SWORD * 4); + } + } + + shieldEquipValue = gEquipMasks[EQUIP_TYPE_SHIELD] & gSaveContext.equips.equipment; + if (shieldEquipValue) { shieldEquipValue >>= gEquipShifts[EQUIP_TYPE_SHIELD]; if (!CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, shieldEquipValue - 1)) { gSaveContext.equips.equipment &= gEquipNegMasks[EQUIP_TYPE_SHIELD]; diff --git a/app/jni/src/soh/src/code/z_player_lib.c b/app/jni/src/soh/src/code/z_player_lib.c index 820f2c6..ee7fd3f 100644 --- a/app/jni/src/soh/src/code/z_player_lib.c +++ b/app/jni/src/soh/src/code/z_player_lib.c @@ -2307,10 +2307,12 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f* } srcTable = ResourceMgr_LoadArrayByNameAsVec3s(srcTable); + Vec3s* ogSrcTable = srcTable; destTable = skelAnime->jointTable; for (i = 0; i < skelAnime->limbCount; i++) { *destTable++ = *srcTable++; } + free(ogSrcTable); } diff --git a/app/jni/src/soh/src/code/z_skelanime.c b/app/jni/src/soh/src/code/z_skelanime.c index 41df3b9..9c2f1a6 100644 --- a/app/jni/src/soh/src/code/z_skelanime.c +++ b/app/jni/src/soh/src/code/z_skelanime.c @@ -78,6 +78,10 @@ void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable, Vec3f pos; Vec3s rot; + if (CVarGetInteger("gDisableLOD", 0)) { + lod = 0; + } + if (skeleton == NULL) { osSyncPrintf(VT_FGCOL(RED)); osSyncPrintf("Si2_Lod_draw():skelがNULLです。\n"); // "skel is NULL." @@ -144,6 +148,8 @@ void SkelAnime_DrawFlexLimbLod(PlayState* play, s32 limbIndex, void** skeleton, newDList = limbDList = limb->dLists[lod]; + play->flexLimbOverrideMTX = mtx; + if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &newDList, &pos, &rot, arg)) { Matrix_TranslateRotateZYX(&pos, &rot); if (newDList != NULL) { @@ -191,6 +197,10 @@ void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable, Vec3s rot; Mtx* mtx = Graph_Alloc(play->state.gfxCtx, dListCount * sizeof(Mtx)); + if (CVarGetInteger("gDisableLOD", 0)) { + lod = 0; + } + if (skeleton == NULL) { osSyncPrintf(VT_FGCOL(RED)); osSyncPrintf("Si2_Lod_draw_SV():skelがNULLです。\n"); // "skel is NULL." @@ -212,6 +222,8 @@ void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable, newDList = limbDList = rootLimb->dLists[lod]; + play->flexLimbOverrideMTX = &mtx; + if ((overrideLimbDraw == 0) || !overrideLimbDraw(play, 1, &newDList, &pos, &rot, arg)) { Matrix_TranslateRotateZYX(&pos, &rot); if (newDList != NULL) { @@ -298,6 +310,20 @@ void SkelAnime_DrawSkeletonOpa(PlayState* play, SkelAnime* skelAnime, OverrideLi } } +Gfx* SkelAnime_DrawSkeleton2(PlayState* play, SkelAnime* skelAnime, OverrideLimbDrawOpa overrideLimbDraw, + PostLimbDrawOpa postLimbDraw, void* arg, Gfx* gfx) +{ + if (skelAnime->skeletonHeader->skeletonType == SKELANIME_TYPE_NORMAL) { + return SkelAnime_Draw(play, skelAnime->skeleton, skelAnime->jointTable, overrideLimbDraw, postLimbDraw, arg, gfx); + } else if (skelAnime->skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + FlexSkeletonHeader* flexHeader = (FlexSkeletonHeader*)skelAnime->skeletonHeader; + return SkelAnime_DrawFlex(play, skelAnime->skeleton, skelAnime->jointTable, flexHeader->dListCount, + overrideLimbDraw, postLimbDraw, arg, gfx); + } + + return gfx; +} + /** * Draw all limbs of type `StandardLimb` in a given skeleton to the polyOpa buffer */ @@ -375,6 +401,8 @@ void SkelAnime_DrawFlexLimbOpa(PlayState* play, s32 limbIndex, void** skeleton, newDList = limbDList = limb->dList; + play->flexLimbOverrideMTX = limbMatricies; + if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &newDList, &pos, &rot, arg)) { Matrix_TranslateRotateZYX(&pos, &rot); if (newDList != NULL) { diff --git a/app/jni/src/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c b/app/jni/src/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c index 1f27915..3a8a821 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c @@ -1288,6 +1288,10 @@ block_1: if (*dList != NULL) { OPEN_DISPS(play->state.gfxCtx); + if (this->skelAnime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + MATRIX_TOMTX(*play->flexLimbOverrideMTX); + } + mtxScaleZ = 1.0f; mtxScaleY = 1.0f; @@ -1308,11 +1312,20 @@ block_1: Matrix_RotateX(-(this->unk_25C[limbIndex] * 0.115f), MTXMODE_APPLY); } - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + if (this->skelAnime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + gSPMatrix(POLY_OPA_DISP++, *play->flexLimbOverrideMTX, G_MTX_LOAD); + } else { + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + } + gSPDisplayList(POLY_OPA_DISP++, *dList); Matrix_Pop(); + if (this->skelAnime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + (*play->flexLimbOverrideMTX)++; + } + CLOSE_DISPS(play->state.gfxCtx); } { s32 pad; } // Required to match diff --git a/app/jni/src/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c b/app/jni/src/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c index 6de72fd..f6e2b3f 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c @@ -2015,12 +2015,26 @@ s32 BossGoma_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f Matrix_TranslateRotateZYX(pos, rot); if (*dList != NULL) { + if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + MATRIX_TOMTX(*play->flexLimbOverrideMTX); + } + Matrix_Push(); Matrix_Scale(this->eyeIrisScaleX, this->eyeIrisScaleY, 1.0f, MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + gSPMatrix(POLY_OPA_DISP++, *play->flexLimbOverrideMTX, G_MTX_LOAD); + } else { + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + } + gSPDisplayList(POLY_OPA_DISP++, *dList); Matrix_Pop(); + + if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + (*play->flexLimbOverrideMTX)++; + } } doNotDrawLimb = true; @@ -2034,14 +2048,28 @@ s32 BossGoma_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f Matrix_TranslateRotateZYX(pos, rot); if (*dList != NULL) { + if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + MATRIX_TOMTX(*play->flexLimbOverrideMTX); + } + Matrix_Push(); Matrix_Scale(this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4], this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4], this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4], MTXMODE_APPLY); - gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), - G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + gSPMatrix(POLY_OPA_DISP++, *play->flexLimbOverrideMTX, G_MTX_LOAD); + } else { + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + } + gSPDisplayList(POLY_OPA_DISP++, *dList); Matrix_Pop(); + + if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) { + (*play->flexLimbOverrideMTX)++; + } } doNotDrawLimb = true; diff --git a/app/jni/src/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/app/jni/src/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 5940f8c..08b9a07 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -1055,7 +1055,7 @@ void DoorWarp1_DrawBlueCrystal(DoorWarp1* this, PlayState* play) { gDPSetPrimColor(POLY_XLU_DISP++, 0xFF, 0xFF, 200, 255, 255, (u8)this->crystalAlpha); gDPSetEnvColor(POLY_XLU_DISP++, 0, 100, 255, (u8)this->crystalAlpha); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, NULL, NULL, &this->actor, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); @@ -1079,7 +1079,7 @@ void DoorWarp1_DrawPurpleCrystal(DoorWarp1* this, PlayState* play) { gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)this->crystalAlpha); gDPSetEnvColor(POLY_XLU_DISP++, 150, 0, 100, (u8)this->crystalAlpha); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, NULL, NULL, &this->actor, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c index 74f89cb..a50dabe 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c @@ -768,7 +768,7 @@ void EnBili_Draw(Actor* thisx, PlayState* play) { gSPSegment(POLY_XLU_DISP++, 0x09, D_809C1700); } - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnBili_OverrideLimbDraw, NULL, this, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Box/z_en_box.c index 4f1ef73..359c983 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -947,7 +947,7 @@ void EnBox_Draw(Actor* thisx, PlayState* play) { gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); gSPSegment(POLY_OPA_DISP++, 0x08, EnBox_EmptyDList(play->state.gfxCtx)); Gfx_SetupDL_25Opa(play->state.gfxCtx); - POLY_OPA_DISP = SkelAnime_Draw(play, this->skelanime.skeleton, this->skelanime.jointTable, NULL, + POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelanime, NULL, EnBox_PostLimbDraw, this, POLY_OPA_DISP); } else if (this->alpha != 0) { gDPPipeSync(POLY_XLU_DISP++); @@ -958,7 +958,7 @@ void EnBox_Draw(Actor* thisx, PlayState* play) { } else { gSPSegment(POLY_XLU_DISP++, 0x08, func_809CA4A0(play->state.gfxCtx)); } - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelanime.skeleton, this->skelanime.jointTable, NULL, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelanime, NULL, EnBox_PostLimbDraw, this, POLY_XLU_DISP); } diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c index a57594a..e64abd8 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c @@ -856,7 +856,7 @@ void EnBw_Draw(Actor* thisx, PlayState* play2) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gDPSetEnvColor(POLY_OPA_DISP++, this->color1.r, this->color1.g, this->color1.b, this->color1.a); gSPSegment(POLY_OPA_DISP++, 0x08, &D_80116280[2]); - POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnBw_OverrideLimbDraw, NULL, this, POLY_OPA_DISP); } else { Gfx_SetupDL_25Xlu(play->state.gfxCtx); @@ -864,7 +864,7 @@ void EnBw_Draw(Actor* thisx, PlayState* play2) { gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 0, 0, 0, this->color1.a); gDPSetEnvColor(POLY_XLU_DISP++, this->color1.r, this->color1.g, this->color1.b, this->color1.a); gSPSegment(POLY_XLU_DISP++, 0x08, &D_80116280[0]); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnBw_OverrideLimbDraw, NULL, this, POLY_XLU_DISP); } diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c index 0495707..7340d9c 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c @@ -708,14 +708,14 @@ void EnEiyer_Draw(Actor* thisx, PlayState* play) { gSPSegment(POLY_OPA_DISP++, 0x08, &D_80116280[2]); gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); - POLY_OPA_DISP = SkelAnime_Draw(play, this->skelanime.skeleton, this->skelanime.jointTable, + POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelanime, EnEiyer_OverrideLimbDraw, NULL, this, POLY_OPA_DISP); } else { Gfx_SetupDL_25Xlu(play->state.gfxCtx); gSPSegment(POLY_XLU_DISP++, 0x08, D_80116280); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->actor.shape.shadowAlpha); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelanime.skeleton, this->skelanime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelanime, EnEiyer_OverrideLimbDraw, NULL, this, POLY_XLU_DISP); } CLOSE_DISPS(play->state.gfxCtx); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 2191dae..ec288ee 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -1540,7 +1540,7 @@ void EnElf_Draw(Actor* thisx, PlayState* play) { gSPEndDisplayList(dListHead++); gDPSetEnvColor(POLY_XLU_DISP++, (u8)this->outerColor.r, (u8)this->outerColor.g, (u8)this->outerColor.b, (u8)(envAlpha * alphaScale)); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnElf_OverrideLimbDraw, NULL, this, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c index bf7b79b..f0fcf03 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c @@ -837,8 +837,9 @@ void EnFirefly_Draw(Actor* thisx, PlayState* play) { gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); } - POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, - EnFirefly_OverrideLimbDraw, EnFirefly_PostLimbDraw, &this->actor, POLY_OPA_DISP); + POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnFirefly_OverrideLimbDraw, EnFirefly_PostLimbDraw, + &this->actor, POLY_OPA_DISP); + CLOSE_DISPS(play->state.gfxCtx); } @@ -854,7 +855,7 @@ void EnFirefly_DrawInvisible(Actor* thisx, PlayState* play) { gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 255); } - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnFirefly_OverrideLimbDraw, EnFirefly_PostLimbDraw, this, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c index 8780ab1..7f7b92c 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c @@ -858,7 +858,7 @@ void EnPartner_Draw(Actor* thisx, PlayState* play) { gSPEndDisplayList(dListHead++); gDPSetEnvColor(POLY_XLU_DISP++, (u8)this->outerColor.r, (u8)this->outerColor.g, (u8)this->outerColor.b, (u8)(envAlpha * alphaScale)); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPartner_OverrideLimbDraw, NULL, this, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c index 5515522..2c00b28 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c @@ -267,7 +267,7 @@ void EnPoDesert_Draw(Actor* thisx, PlayState* play) { } else { gSPSegment(POLY_XLU_DISP++, 0x0C, D_80116280 + 2); } - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPoDesert_OverrideLimbDraw, EnPoDesert_PostLimbDraw, &this->actor, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); } diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c index c11feb3..eba331a 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c @@ -944,15 +944,14 @@ void EnPoField_Draw(Actor* thisx, PlayState* play) { this->lightColor.a)); gSPSegment(POLY_OPA_DISP++, 0x0C, D_80116280 + 2); POLY_OPA_DISP = - SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPoField_OverrideLimbDraw2, EnPoField_PostLimDraw2, &this->actor, POLY_OPA_DISP); } else { gSPSegment(POLY_XLU_DISP++, 0x08, Gfx_EnvColor(play->state.gfxCtx, this->lightColor.r, this->lightColor.g, this->lightColor.b, this->lightColor.a)); gSPSegment(POLY_XLU_DISP++, 0x0C, D_80116280); - POLY_XLU_DISP = - SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPoField_OverrideLimbDraw2, EnPoField_PostLimDraw2, &this->actor, POLY_XLU_DISP); } gDPPipeSync(POLY_OPA_DISP++); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c index ea324c5..8bd5c21 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c @@ -1373,14 +1373,12 @@ void EnPoSisters_Draw(Actor* thisx, PlayState* play) { if (this->unk_22E.a == 255 || this->unk_22E.a == 0) { gDPSetEnvColor(POLY_OPA_DISP++, this->unk_22E.r, this->unk_22E.g, this->unk_22E.b, this->unk_22E.a); gSPSegment(POLY_OPA_DISP++, 0x09, D_80116280 + 2); - POLY_OPA_DISP = - SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, - EnPoSisters_OverrideLimbDraw, EnPoSisters_PostLimbDraw, &this->actor, POLY_OPA_DISP); + POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPoSisters_OverrideLimbDraw, + EnPoSisters_PostLimbDraw, &this->actor, POLY_OPA_DISP); } else { gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->unk_22E.a); gSPSegment(POLY_XLU_DISP++, 0x09, D_80116280); - POLY_XLU_DISP = - SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPoSisters_OverrideLimbDraw, EnPoSisters_PostLimbDraw, &this->actor, POLY_XLU_DISP); } if (!(this->unk_199 & 0x80)) { diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c index 809150f..2c7e904 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c @@ -1085,12 +1085,12 @@ void EnPoh_DrawRegular(Actor* thisx, PlayState* play) { if (this->lightColor.a == 255 || this->lightColor.a == 0) { gDPSetEnvColor(POLY_OPA_DISP++, this->lightColor.r, this->lightColor.g, this->lightColor.b, this->lightColor.a); gSPSegment(POLY_OPA_DISP++, 0x08, D_80116280 + 2); - POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPoh_OverrideLimbDraw, EnPoh_PostLimbDraw, &this->actor, POLY_OPA_DISP); } else { gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->lightColor.a); gSPSegment(POLY_XLU_DISP++, 0x08, D_80116280); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPoh_OverrideLimbDraw, EnPoh_PostLimbDraw, &this->actor, POLY_XLU_DISP); } gDPPipeSync(POLY_OPA_DISP++); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c index d7a838d..c1c4394 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c @@ -814,7 +814,7 @@ void EnVali_Draw(Actor* thisx, PlayState* play) { EnVali_DrawBody(this, play); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnVali_OverrideLimbDraw, EnVali_PostLimbDraw, this, POLY_XLU_DISP); CLOSE_DISPS(play->state.gfxCtx); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c index 4a267b0..e3f19a3 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c @@ -640,13 +640,13 @@ void EnWeiyer_Draw(Actor* thisx, PlayState* play) { Gfx_SetupDL_25Opa(play->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x08, &D_80116280[2]); gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255); - POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, - EnWeiyer_OverrideLimbDraw, NULL, &this->actor, POLY_OPA_DISP); + POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnWeiyer_OverrideLimbDraw, NULL, &this->actor, + POLY_OPA_DISP); } else { Gfx_SetupDL_25Xlu(play->state.gfxCtx); gSPSegment(POLY_XLU_DISP++, 0x08, &D_80116280[0]); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->actor.shape.shadowAlpha); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnWeiyer_OverrideLimbDraw, NULL, &this->actor, POLY_XLU_DISP); } diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c index 4adb7af..0ff04f5 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c @@ -101,13 +101,18 @@ static f32 sSpawnSin; s32 EnWood02_SpawnZoneCheck(EnWood02* this, PlayState* play, Vec3f* pos) { f32 phi_f12; - if (CVarGetInteger("gDisableDrawDistance", 0) != 0) { - return true; - } - SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, pos, &this->actor.projectedPos, &this->actor.projectedW); + // #region SOH [Enhancement] Use the extended culling calculation + if (CVarGetInteger("gDisableDrawDistance", 0) || CVarGetInteger("gEnhancements.WidescreenActorCulling", 0)) { + bool shipShouldDraw = false; + bool shipShouldUpdate = false; + return Ship_CalcShouldDrawAndUpdate(play, &this->actor, &this->actor.projectedPos, this->actor.projectedW, + &shipShouldDraw, &shipShouldUpdate); + } + // #endregion + phi_f12 = ((this->actor.projectedW == 0.0f) ? 1000.0f : fabsf(1.0f / this->actor.projectedW)); if ((-this->actor.uncullZoneScale < this->actor.projectedPos.z) && diff --git a/app/jni/src/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c b/app/jni/src/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c index 9aa8204..dca0af4 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c @@ -2252,7 +2252,7 @@ void EnZf_Draw(Actor* thisx, PlayState* play) { gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->alpha); gSPSegment(POLY_OPA_DISP++, 0x09, &D_80116280[2]); - POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnZf_OverrideLimbDraw, EnZf_PostLimbDraw, this, POLY_OPA_DISP); if (this->iceTimer != 0) { @@ -2271,7 +2271,7 @@ void EnZf_Draw(Actor* thisx, PlayState* play) { gDPPipeSync(POLY_XLU_DISP++); gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha); gSPSegment(POLY_XLU_DISP++, 0x09, &D_80116280[0]); - POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnZf_OverrideLimbDraw, EnZf_PostLimbDraw, this, POLY_XLU_DISP); } CLOSE_DISPS(play->state.gfxCtx); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c b/app/jni/src/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c index 2f5cf4e..2821b47 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c @@ -275,7 +275,12 @@ void ObjMure_InitialAction(ObjMure* this, PlayState* play) { } void ObjMure_CulledState(ObjMure* this, PlayState* play) { - if (fabsf(this->actor.projectedPos.z) < sZClip[this->type] || CVarGetInteger("gDisableDrawDistance", 0) != 0) { + // #region SOH [Enhancements] Extended draw distance + s32 distanceMultiplier = CVarGetInteger("gDisableDrawDistance", 1); + distanceMultiplier = MAX(distanceMultiplier, 1); + + if (fabsf(this->actor.projectedPos.z) < sZClip[this->type] * distanceMultiplier) { + // #endregion this->actionFunc = ObjMure_ActiveState; this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; ObjMure_SpawnActors(this, play); @@ -398,8 +403,13 @@ static ObjMureActionFunc sTypeGroupBehaviorFunc[] = { void ObjMure_ActiveState(ObjMure* this, PlayState* play) { ObjMure_CheckChildren(this, play); - if (sZClip[this->type] + 40.0f <= fabsf(this->actor.projectedPos.z) && - CVarGetInteger("gDisableDrawDistance", 1) != 0) { + + // #region SOH [Enhancements] Extended draw distance + s32 distanceMultiplier = CVarGetInteger("gDisableDrawDistance", 1); + distanceMultiplier = MAX(distanceMultiplier, 1); + + if ((sZClip[this->type] + 40.0f) * distanceMultiplier <= fabsf(this->actor.projectedPos.z)) { + // #endregion this->actionFunc = ObjMure_CulledState; this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; ObjMure_KillActors(this, play); diff --git a/app/jni/src/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c b/app/jni/src/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c index b883072..1b8905e 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c @@ -190,8 +190,7 @@ void func_80B9A658(ObjMure2* this) { void func_80B9A668(ObjMure2* this, PlayState* play) { if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) < - (sDistSquared1[this->actor.params & 3] * this->unk_184) || - CVarGetInteger("gDisableDrawDistance", 0) != 0) { + (sDistSquared1[this->actor.params & 3] * this->unk_184)) { this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED; ObjMure2_SpawnActors(this, play); func_80B9A6E8(this); @@ -205,12 +204,8 @@ void func_80B9A6E8(ObjMure2* this) { void func_80B9A6F8(ObjMure2* this, PlayState* play) { func_80B9A534(this); - if (CVarGetInteger("gDisableDrawDistance", 0) != 0) { - return; - } - if ((sDistSquared2[this->actor.params & 3] * this->unk_184) <= - Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z)) { + Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z)) { this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED; ObjMure2_CleanupAndDie(this, play); func_80B9A658(this); @@ -225,5 +220,20 @@ void ObjMure2_Update(Actor* thisx, PlayState* play) { } else { this->unk_184 = 4.0f; } + + // SOH [Enhancements] Extended draw distance + s32 distanceMultiplier = CVarGetInteger("gDisableDrawDistance", 1); + if (CVarGetInteger("gEnhancements.WidescreenActorCulling", 0) || distanceMultiplier > 1) { + f32 originalAspectRatio = 4.0f / 3.0f; + f32 currentAspectRatio = OTRGetAspectRatio(); + // Adjust ratio difference based on field of view testing + f32 ratioAdjusted = 1.0f + (MAX(currentAspectRatio / originalAspectRatio, 1.0f) / 1.5f); + // Distance multiplier is squared due to the checks above for squared distances + distanceMultiplier = SQ(MAX(distanceMultiplier, 1)); + + // Prefer the largest of the three values + this->unk_184 = MAX(MAX((f32)distanceMultiplier, ratioAdjusted), this->unk_184); + } + this->actionFunc(this, play); } diff --git a/app/jni/src/soh/src/overlays/actors/ovl_player_actor/z_player.c b/app/jni/src/soh/src/overlays/actors/ovl_player_actor/z_player.c index ca73334..f4a072c 100644 --- a/app/jni/src/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/app/jni/src/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -11339,10 +11339,6 @@ void Player_Draw(Actor* thisx, PlayState* play2) { lod = 1; } - if (CVarGetInteger("gDisableLOD", 0) != 0) { - lod = 0; - } - func_80093C80(play); Gfx_SetupDL_25Xlu(play->state.gfxCtx); diff --git a/app/jni/src/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c b/app/jni/src/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c index 5c5cb3e..1682de4 100644 --- a/app/jni/src/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c +++ b/app/jni/src/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c @@ -692,6 +692,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) { sLastOptionButtonIndex = -1; osSyncPrintf("SAVE"); Save_SaveGlobal(); + CVarSave(); osSyncPrintf(VT_FGCOL(YELLOW)); osSyncPrintf("Na_SetSoundOutputMode = %d\n", gSaveContext.audioSetting); osSyncPrintf("Na_SetSoundOutputMode = %d\n", gSaveContext.audioSetting); diff --git a/app/jni/src/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/app/jni/src/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index 665c95b..4e82cb8 100644 --- a/app/jni/src/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/app/jni/src/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -237,8 +237,8 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { s16 oldCursorPoint; s16 moveCursorResult; bool dpad = (CVarGetInteger("gDpadPause", 0) && !CHECK_BTN_ALL(input->cur.button, BTN_CUP)); - bool pauseAnyCursor = (CVarGetInteger("gPauseAnyCursor", 0) == PAUSE_ANY_CURSOR_RANDO_ONLY && IS_RANDO) || - (CVarGetInteger("gPauseAnyCursor", 0) == PAUSE_ANY_CURSOR_ALWAYS_ON); + bool pauseAnyCursor = pauseCtx->cursorSpecialPos == 0 && ((CVarGetInteger("gPauseAnyCursor", 0) == PAUSE_ANY_CURSOR_RANDO_ONLY && IS_RANDO) || + (CVarGetInteger("gPauseAnyCursor", 0) == PAUSE_ANY_CURSOR_ALWAYS_ON)); // only allow mask select when: // the shop is open: diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d219268..2309948 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,8 +4,8 @@ --> diff --git a/app/src/main/assets/soh.otr b/app/src/main/assets/soh.otr index 9ffa296e14c9c92145f0b346f123d5dd5eb6a398..81be9609f018c3198cc5dc5d6430f250d91b75a6 100644 GIT binary patch delta 82607 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 bm;FWS#_GtI@3)ouvC92Cz%D7Rz19c-kD_HG delta 82604 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 xY=M>vkw~5R?JjHCp0LSW^vrHuH2E(3vDS^%Ki