diff --git a/extern/aurora b/extern/aurora index cb2c340d6c..7dd107e1a4 160000 --- a/extern/aurora +++ b/extern/aurora @@ -1 +1 @@ -Subproject commit cb2c340d6cde6827387f14c31ce19e5f28a40e09 +Subproject commit 7dd107e1a4b7ce07abbe11568f9f8c3031b4df0a diff --git a/files.cmake b/files.cmake index 9b51ddb1e9..7e72920a49 100644 --- a/files.cmake +++ b/files.cmake @@ -1442,6 +1442,8 @@ set(DUSK_FILES src/dusk/speedrun.cpp src/dusk/string.cpp src/dusk/stubs.cpp + include/dusk/texture_replacements.hpp + src/dusk/texture_replacements.cpp src/dusk/update_check.cpp src/dusk/update_check.hpp #src/dusk/m_Do_ext_dusk.cpp diff --git a/include/d/d_msg_scrn_item.h b/include/d/d_msg_scrn_item.h index 4b0e55cbd9..865071a2af 100644 --- a/include/d/d_msg_scrn_item.h +++ b/include/d/d_msg_scrn_item.h @@ -17,8 +17,8 @@ struct dMsgScrnItem_c : public dMsgScrnBase_c { void arwAnimeMove(); void dotAnimeInit(); void dotAnimeMove(); - void setSelectString(char*, char*, char*); - void setSelectRubyString(char*, char*, char*); + void setSelectString(char DUSK_CONST*, char DUSK_CONST*, char DUSK_CONST*); + void setSelectRubyString(char DUSK_CONST*, char DUSK_CONST*, char DUSK_CONST*); bool isSelect(); void selectAnimeInit(u8, u8, f32, u8); bool selectAnimeMove(u8, u8, bool); diff --git a/include/d/d_msg_scrn_talk.h b/include/d/d_msg_scrn_talk.h index 05b187e709..1c8283ad44 100644 --- a/include/d/d_msg_scrn_talk.h +++ b/include/d/d_msg_scrn_talk.h @@ -17,8 +17,8 @@ struct dMsgScrnTalk_c : public dMsgScrnBase_c { void arwAnimeMove(); void dotAnimeInit(); void dotAnimeMove(); - void setSelectString(char*, char*, char*); - void setSelectRubyString(char*, char*, char*); + void setSelectString(char DUSK_CONST*, char DUSK_CONST*, char DUSK_CONST*); + void setSelectRubyString(char DUSK_CONST*, char DUSK_CONST*, char DUSK_CONST*); bool isSelect(); void selectAnimeInit(u8, u8, f32, u8); bool selectAnimeMove(u8, u8, bool); diff --git a/include/dusk/settings.h b/include/dusk/settings.h index e36f0b9f24..f48f5862ca 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -230,7 +230,6 @@ struct UserSettings { ConfigVar fastSpinner; ConfigVar freeMagicArmor; ConfigVar invincibleEnemies; - ConfigVar transformWithoutShadowCrystal; // Technical ConfigVar restoreWiiGlitches; diff --git a/include/dusk/texture_replacements.hpp b/include/dusk/texture_replacements.hpp new file mode 100644 index 0000000000..ffb3fe8d62 --- /dev/null +++ b/include/dusk/texture_replacements.hpp @@ -0,0 +1,12 @@ +#ifndef DUSK_TEXTURE_REPLACEMENTS_HPP +#define DUSK_TEXTURE_REPLACEMENTS_HPP + +namespace dusk::texture_replacements { + +void reload(); +void set_enabled(bool enabled); +void shutdown(); + +} + +#endif diff --git a/src/d/actor/d_a_alink_dusk.cpp b/src/d/actor/d_a_alink_dusk.cpp index ef14eadd9f..8c1d415ae0 100644 --- a/src/d/actor/d_a_alink_dusk.cpp +++ b/src/d/actor/d_a_alink_dusk.cpp @@ -72,7 +72,7 @@ void daAlink_c::handleQuickTransform() { } // Check to see if Link has the ability to transform. - if (!dComIfGs_isEventBit(dSv_event_flag_c::M_077) && !dusk::getSettings().game.transformWithoutShadowCrystal) { + if (!dComIfGs_isEventBit(dSv_event_flag_c::M_077)) { return; } @@ -102,7 +102,7 @@ void daAlink_c::handleQuickTransform() { } // Ensure that the Z Button is not dimmed - if (meterDrawPtr->getButtonZAlpha() != 1.f && !dusk::getSettings().game.transformWithoutShadowCrystal) { + if (meterDrawPtr->getButtonZAlpha() != 1.f) { Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); return; } @@ -122,7 +122,7 @@ void daAlink_c::handleQuickTransform() { bool canTransform = false; if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && !checkMagneBootsOn()) { - if (checkMidnaRide() || dusk::getSettings().game.transformWithoutShadowCrystal) { + if (checkMidnaRide()) { if ((checkWolf() && (checkModeFlg(MODE_UNK_1000) || dComIfGp_checkPlayerStatus0(0, 0x10))) || (!checkWolf() && diff --git a/src/d/actor/d_a_midna.cpp b/src/d/actor/d_a_midna.cpp index b33229e08c..3082fc6a71 100644 --- a/src/d/actor/d_a_midna.cpp +++ b/src/d/actor/d_a_midna.cpp @@ -3106,18 +3106,14 @@ void daMidna_c::setMidnaNoDrawFlg() { BOOL daMidna_c::checkMetamorphoseEnableBase() { BOOL tmp; + if (!daAlink_getAlinkActorClass()->checkMidnaRide() || (g_env_light.mEvilInitialized & 0x80) || + /* dSv_event_flag_c::M_077 - Main Event - Get shadow crystal (can now transform) */ + !dComIfGs_isEventBit(0xD04) || #if TARGET_PC - if (((!daAlink_getAlinkActorClass()->checkMidnaRide() || (g_env_light.mEvilInitialized & 0x80) || - /* dSv_event_flag_c::M_077 - Main Event - Get shadow crystal (can now transform) */ - !dComIfGs_isEventBit(0xD04)) && - !dusk::getSettings().game.transformWithoutShadowCrystal) || - (fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp) && - !dusk::getSettings().game.canTransformAnywhere) + (fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp) && + !dusk::getSettings().game.canTransformAnywhere) #else - if (!daAlink_getAlinkActorClass()->checkMidnaRide() || (g_env_light.mEvilInitialized & 0x80) || - /* dSv_event_flag_c::M_077 - Main Event - Get shadow crystal (can now transform) */ - !dComIfGs_isEventBit(0xD04) || - fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp) + fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp) #endif ) { diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index 3e881e63f8..93fc15ca8f 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -2843,11 +2843,7 @@ BOOL dComIfGs_Wolf_Change_Check() { BOOL is_wolf = false; // Transforming Unlocked - if (dComIfGs_isEventBit(0x0D04) -#if TARGET_PC - || dusk::getSettings().game.transformWithoutShadowCrystal -#endif - ) { + if (dComIfGs_isEventBit(0x0D04)) { is_wolf = dComIfGs_getTransformStatus(); } else if (dComIfGs_isTransformLV(0) && !dComIfGs_isDarkClearLV(0)) { is_wolf = true; diff --git a/src/d/d_msg_scrn_item.cpp b/src/d/d_msg_scrn_item.cpp index 672700682d..26a741e320 100644 --- a/src/d/d_msg_scrn_item.cpp +++ b/src/d/d_msg_scrn_item.cpp @@ -504,11 +504,11 @@ void dMsgScrnItem_c::dotAnimeMove() { mpArrow_c->dotAnimeMove(); } -void dMsgScrnItem_c::setSelectString(char* param_0, char* param_1, char* param_2) { +void dMsgScrnItem_c::setSelectString(char DUSK_CONST* param_0, char DUSK_CONST* param_1, char DUSK_CONST* param_2) { mpSelect_c->setString(param_0, param_1, param_2); } -void dMsgScrnItem_c::setSelectRubyString(char* param_0, char* param_1, char* param_2) { +void dMsgScrnItem_c::setSelectRubyString(char DUSK_CONST* param_0, char DUSK_CONST* param_1, char DUSK_CONST* param_2) { mpSelect_c->setRubyString(param_0, param_1, param_2); } diff --git a/src/d/d_msg_scrn_talk.cpp b/src/d/d_msg_scrn_talk.cpp index ace5abd3bb..5cf1b184da 100644 --- a/src/d/d_msg_scrn_talk.cpp +++ b/src/d/d_msg_scrn_talk.cpp @@ -383,13 +383,13 @@ void dMsgScrnTalk_c::dotAnimeMove() { mpArrow_c->dotAnimeMove(); } -void dMsgScrnTalk_c::setSelectString(char* param_0, char* param_1, char* param_2) { +void dMsgScrnTalk_c::setSelectString(char DUSK_CONST* param_0, char DUSK_CONST* param_1, char DUSK_CONST* param_2) { if (mpSelect_c != NULL) { mpSelect_c->setString(param_0, param_1, param_2); } } -void dMsgScrnTalk_c::setSelectRubyString(char* param_0, char* param_1, char* param_2) { +void dMsgScrnTalk_c::setSelectRubyString(char DUSK_CONST* param_0, char DUSK_CONST* param_1, char DUSK_CONST* param_2) { if (mpSelect_c != NULL) { mpSelect_c->setRubyString(param_0, param_1, param_2); } diff --git a/src/dusk/modding/mod_loader_overlay.cpp b/src/dusk/modding/mod_loader_overlay.cpp index 994433a543..b1b1866748 100644 --- a/src/dusk/modding/mod_loader_overlay.cpp +++ b/src/dusk/modding/mod_loader_overlay.cpp @@ -3,8 +3,6 @@ #include "dusk/mod_loader.hpp" #include "mod_loader.hpp" -#include "absl/container/flat_hash_map.h" - #include using namespace std::string_literals; @@ -20,19 +18,6 @@ struct OverlayFileData { std::vector s_overlayFiles; -s32 s_nextEntryNum; -absl::flat_hash_map s_entryNumIndex; - -s32 assignEntryNum(std::string_view const fileName) { - if (s_entryNumIndex.contains(fileName)) { - return s_entryNumIndex[fileName]; - } - - auto const newEntryNum = s_nextEntryNum++; - s_entryNumIndex[fileName] = newEntryNum; - return newEntryNum; -} - void findOverlayFiles(std::vector& files, dusk::LoadedMod& mod) { for (const auto& file : mod.bundle->getFileNames()) { if (!file.starts_with("overlay/")) { @@ -50,8 +35,7 @@ void findOverlayFiles(std::vector& files, dusk::LoadedMod& mo files.emplace_back( strdup(overlayPath.c_str()), reinterpret_cast(index), - size, - assignEntryNum(overlayPath)); + size); } } @@ -108,8 +92,6 @@ namespace dusk { void ModLoader::initOverlayFiles() { Log.debug("Initializing overlay files..."); - s_nextEntryNum = aurora_dvd_base_entry_count(); - aurora_dvd_overlay_callbacks(&s_overlayCallbacks); std::vector files; @@ -119,7 +101,7 @@ void ModLoader::initOverlayFiles() { } Log.debug("Found {} overlay files.", files.size()); - aurora_dvd_overlay_files(files.data(), files.size()); + aurora_dvd_overlay_files(files.data(), files.size(), nullptr); for (const auto& file : files) { std::free(const_cast(file.fileName)); diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index cc8d54a517..3bea017e2c 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -123,7 +123,6 @@ UserSettings g_userSettings = { .fastSpinner {"game.fastSpinner", false}, .freeMagicArmor {"game.freeMagicArmor", false}, .invincibleEnemies {"game.invincibleEnemies", false}, - .transformWithoutShadowCrystal {"game.transformWithoutShadowCrystal", false}, // Technical .restoreWiiGlitches {"game.restoreWiiGlitches", false}, @@ -209,7 +208,6 @@ void registerSettings() { // Game Register(g_userSettings.game.language); Register(g_userSettings.game.enableQuickTransform); - Register(g_userSettings.game.transformWithoutShadowCrystal); Register(g_userSettings.game.hideTvSettingsScreen); Register(g_userSettings.game.biggerWallets); Register(g_userSettings.game.noReturnRupees); diff --git a/src/dusk/texture_replacements.cpp b/src/dusk/texture_replacements.cpp new file mode 100644 index 0000000000..5477a38dd9 --- /dev/null +++ b/src/dusk/texture_replacements.cpp @@ -0,0 +1,38 @@ +#include "dusk/texture_replacements.hpp" + +#include + +#include "dusk/logging.h" +#include "dusk/main.h" +#include "dusk/settings.h" + +namespace dusk::texture_replacements { +namespace { +aurora::texture::ReplacementGroup s_directoryGroup; +} + +void reload() { + aurora::texture::unregister_replacements(s_directoryGroup); + s_directoryGroup.registrations.clear(); + + if (!getSettings().game.enableTextureReplacements) { + return; + } + + const auto root = ConfigPath / "texture_replacements"; + s_directoryGroup = aurora::texture::load_replacement_directory(root); + DuskLog.info("Texture replacement directory loaded: {} registration(s)", + s_directoryGroup.registrations.size()); +} + +void set_enabled(bool enabled) { + getSettings().game.enableTextureReplacements.setValue(enabled); + reload(); +} + +void shutdown() { + aurora::texture::unregister_replacements(s_directoryGroup); + s_directoryGroup.registrations.clear(); +} + +} diff --git a/src/dusk/ui/graphics_tuner.cpp b/src/dusk/ui/graphics_tuner.cpp index 22f0013a49..57fa3ee329 100644 --- a/src/dusk/ui/graphics_tuner.cpp +++ b/src/dusk/ui/graphics_tuner.cpp @@ -11,6 +11,7 @@ #include "dusk/config.hpp" #include "dusk/settings.h" +#include "dusk/texture_replacements.hpp" #include #include @@ -98,8 +99,7 @@ void set_value(GraphicsOption option, int value) { getSettings().game.bloomMultiplier.setValue(std::clamp(value, 0, 100) / 100.0f); break; case GraphicsOption::TextureReplacements: - getSettings().game.enableTextureReplacements.setValue(static_cast(value)); - aurora_set_texture_replacements_enabled(static_cast(value)); + texture_replacements::set_enabled(static_cast(value)); break; } } diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index 444b910dd5..b269f09b57 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -1294,8 +1294,6 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { "Lets the magic armor work without consuming rupees."); addCheat("Invincible Enemies", getSettings().game.invincibleEnemies, "Prevents enemies from taking damage."); - addCheat("Transform without Shadow Crystal", getSettings().game.transformWithoutShadowCrystal, - "Allows Link to transform without the Shadow Crystal (Only using Quick Transform.)"); }); add_tab("Interface", [this](Rml::Element* content) { diff --git a/src/m_Do/m_Do_main.cpp b/src/m_Do/m_Do_main.cpp index 542b64584b..98c509e9ed 100644 --- a/src/m_Do/m_Do_main.cpp +++ b/src/m_Do/m_Do_main.cpp @@ -85,6 +85,7 @@ #include "dusk/config.hpp" #include "dusk/speedrun.h" #include "dusk/settings.h" +#include "dusk/texture_replacements.hpp" #include "dusk/io.hpp" #include "dusk/version.hpp" #include "dusk/discord_presence.hpp" @@ -578,7 +579,6 @@ int game_main(int argc, char* argv[]) { config.allowJoystickBackgroundEvents = dusk::getSettings().game.allowBackgroundInput; config.pauseOnFocusLost = dusk::getSettings().game.pauseOnFocusLost; config.imGuiInitCallback = &aurora_imgui_init_callback; - config.allowTextureReplacements = dusk::getSettings().game.enableTextureReplacements; config.allowTextureDumps = false; auroraInfo = aurora_initialize(argc, argv, &config); } @@ -628,6 +628,7 @@ int game_main(int argc, char* argv[]) { return 0; } + dusk::texture_replacements::reload(); dusk::ui::initialize(); dusk::ui::push_document(std::make_unique(), true, true); dusk::ui::push_document(std::make_unique(), false); @@ -786,7 +787,7 @@ int game_main(int argc, char* argv[]) { dusk::discord::shutdown(); #endif dusk::ui::shutdown(); - + dusk::texture_replacements::shutdown(); dusk::config::Shutdown(); aurora_shutdown();