From e5c032f6e606cedfc4920a8f159fdb27a39bba24 Mon Sep 17 00:00:00 2001 From: Sirius902 <10891979+Sirius902@users.noreply.github.com> Date: Thu, 28 May 2026 18:15:56 -0700 Subject: [PATCH 1/5] fix: item and talk rendering (#1896) --- include/d/d_msg_scrn_item.h | 4 ++-- include/d/d_msg_scrn_talk.h | 4 ++-- src/d/d_msg_scrn_item.cpp | 4 ++-- src/d/d_msg_scrn_talk.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) 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/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); } From 5269eadfafcace449b13ccf84205132fa2aef1d6 Mon Sep 17 00:00:00 2001 From: Supern_Ice Date: Fri, 29 May 2026 15:26:26 +0100 Subject: [PATCH 2/5] Added Sword and Shield skip Achievement --- src/dusk/achievements.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/dusk/achievements.cpp b/src/dusk/achievements.cpp index 6c4de43487..39443beabe 100644 --- a/src/dusk/achievements.cpp +++ b/src/dusk/achievements.cpp @@ -931,6 +931,29 @@ std::vector AchievementSystem::makeEntries() { }, {} }, + { + { + "sword_and_shield_skip", "Sword and Shield Skip", + "Pass through the Twilight Wall in Ordon Spring before obtaining both the Ordon Sword " + "and Shield.", + AchievementCategory::Glitched, false, 0, 0, false + }, + [](Achievement& a, json&) { + bool hasOrdonSword = false; + bool hasOrdonShield = false; + if (dComIfGs_isCollectSword(COLLECT_ORDON_SWORD)) { + hasOrdonSword = true; + } + if (dComIfGs_isCollectShield(COLLECT_ORDON_SHIELD)) { + hasOrdonShield = true; + } + if ((!hasOrdonSword || !hasOrdonShield) && + dComIfGs_isEventBit(dSv_event_flag_c::M_013)) { + a.progress = 1; + } + }, + {} + }, { { "early_master_sword", From bf0dc854687fd09c01bb29882e766bc0df62092f Mon Sep 17 00:00:00 2001 From: tomlube Date: Fri, 29 May 2026 15:14:05 -0400 Subject: [PATCH 3/5] Revert "Added Sword and Shield skip Achievement" (#1917) --- src/dusk/achievements.cpp | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/dusk/achievements.cpp b/src/dusk/achievements.cpp index 39443beabe..6c4de43487 100644 --- a/src/dusk/achievements.cpp +++ b/src/dusk/achievements.cpp @@ -931,29 +931,6 @@ std::vector AchievementSystem::makeEntries() { }, {} }, - { - { - "sword_and_shield_skip", "Sword and Shield Skip", - "Pass through the Twilight Wall in Ordon Spring before obtaining both the Ordon Sword " - "and Shield.", - AchievementCategory::Glitched, false, 0, 0, false - }, - [](Achievement& a, json&) { - bool hasOrdonSword = false; - bool hasOrdonShield = false; - if (dComIfGs_isCollectSword(COLLECT_ORDON_SWORD)) { - hasOrdonSword = true; - } - if (dComIfGs_isCollectShield(COLLECT_ORDON_SHIELD)) { - hasOrdonShield = true; - } - if ((!hasOrdonSword || !hasOrdonShield) && - dComIfGs_isEventBit(dSv_event_flag_c::M_013)) { - a.progress = 1; - } - }, - {} - }, { { "early_master_sword", From bc3cdcc9555057457d0064174bec9c1b79315cac Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 29 May 2026 21:20:15 -0600 Subject: [PATCH 4/5] =?UTF-8?q?Revert=20"Adds=20a=20new=20cheat=20that=20l?= =?UTF-8?q?et=20you=20transform=20from=20the=20start=20of=20the=20game.=20?= =?UTF-8?q?(=E2=80=A6"=20(#1927)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 62c19c0f64705215f02da068618d5cdee28ad4a1. --- include/dusk/settings.h | 1 - src/d/actor/d_a_alink_dusk.cpp | 6 +++--- src/d/actor/d_a_midna.cpp | 16 ++++++---------- src/d/d_com_inf_game.cpp | 6 +----- src/dusk/settings.cpp | 2 -- src/dusk/ui/settings.cpp | 2 -- 6 files changed, 10 insertions(+), 23 deletions(-) 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/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/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/ui/settings.cpp b/src/dusk/ui/settings.cpp index 99dee7ace7..44fd9e1724 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) { From 81caa89e12e4611113c20c5a653531f7c0c4594c Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 31 May 2026 03:57:17 +0200 Subject: [PATCH 5/5] Update Aurora & use new texture replacements API (#1935) Cherry picked from TPHD branch Co-authored-by: Luke Street --- extern/aurora | 2 +- files.cmake | 2 ++ include/dusk/texture_replacements.hpp | 12 +++++++++ src/dusk/texture_replacements.cpp | 38 +++++++++++++++++++++++++++ src/dusk/ui/graphics_tuner.cpp | 4 +-- src/m_Do/m_Do_main.cpp | 4 ++- 6 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 include/dusk/texture_replacements.hpp create mode 100644 src/dusk/texture_replacements.cpp 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 ebfa843b24..fe558ba41f 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/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/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/m_Do/m_Do_main.cpp b/src/m_Do/m_Do_main.cpp index fbd872efc4..bf37f964e6 100644 --- a/src/m_Do/m_Do_main.cpp +++ b/src/m_Do/m_Do_main.cpp @@ -84,6 +84,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" @@ -585,7 +586,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); } @@ -635,6 +635,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); @@ -783,6 +784,7 @@ int game_main(int argc, char* argv[]) { dusk::discord::shutdown(); #endif dusk::ui::shutdown(); + dusk::texture_replacements::shutdown(); aurora_shutdown(); return 0;