From cf022a9a55a9e422a383443c28304d63fdd8a64d Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 4 Apr 2026 11:36:15 -0400 Subject: [PATCH 1/6] Non-Stop Midna's Lament Audio Enhancement --- include/dusk/settings.h | 3 +++ src/Z2AudioLib/Z2SoundObjMgr.cpp | 7 +++++++ src/dusk/imgui/ImGuiMenuEnhancements.cpp | 9 +++++++++ src/dusk/settings.cpp | 3 +++ 4 files changed, 22 insertions(+) diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 582c5a1872..d6e7ac2791 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -45,6 +45,9 @@ struct UserSettings { bool enableBloom; bool useWaterProjectionOffset; + // Audio + bool midnasLamentNonStop; + // Cheats bool enableFastIronBoots; diff --git a/src/Z2AudioLib/Z2SoundObjMgr.cpp b/src/Z2AudioLib/Z2SoundObjMgr.cpp index 6b080134fb..9fd9c4addb 100644 --- a/src/Z2AudioLib/Z2SoundObjMgr.cpp +++ b/src/Z2AudioLib/Z2SoundObjMgr.cpp @@ -107,6 +107,13 @@ static Z2EnemyInfo mEnemyInfo[64] = { void Z2SoundObjMgr::searchEnemy() { twilightBattle_ = 0; + #if TARGET_PC + if (Z2GetSeqMgr()->checkBgmIDPlaying(Z2BGM_MIDNA_SOS)) { + Z2GetSeqMgr()->changeSubBgmStatus(0); + return; + } + #endif + if (!Z2GetLink()) { Z2GetSeqMgr()->stopBattleBgm(1, 1); return; diff --git a/src/dusk/imgui/ImGuiMenuEnhancements.cpp b/src/dusk/imgui/ImGuiMenuEnhancements.cpp index cf7fcc41d7..a0559c89b4 100644 --- a/src/dusk/imgui/ImGuiMenuEnhancements.cpp +++ b/src/dusk/imgui/ImGuiMenuEnhancements.cpp @@ -67,6 +67,15 @@ namespace dusk { ImGui::EndMenu(); } + if (ImGui::BeginMenu("Audio")) { + ImGui::Checkbox("Non-Stop Midna's Lament", &getSettings().game.midnasLamentNonStop); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Prevents enemy music while Midna's Lament is playing."); + } + + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Cheats")) { ImGui::Checkbox("Fast Iron Boots", &getSettings().game.enableFastIronBoots); diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index ea17eef374..7a11101906 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -41,6 +41,9 @@ UserSettings g_userSettings = { .enableBloom = true, .useWaterProjectionOffset = false, + // Audio + .midnasLamentNonStop = false, + // Cheats .enableFastIronBoots = false, From b4daecaab3c7909e1b8eb2637da7f3ff8947d29e Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 4 Apr 2026 11:57:42 -0400 Subject: [PATCH 2/6] oops, forgot to check the box --- src/Z2AudioLib/Z2SoundObjMgr.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Z2AudioLib/Z2SoundObjMgr.cpp b/src/Z2AudioLib/Z2SoundObjMgr.cpp index 9fd9c4addb..19099c7675 100644 --- a/src/Z2AudioLib/Z2SoundObjMgr.cpp +++ b/src/Z2AudioLib/Z2SoundObjMgr.cpp @@ -108,7 +108,9 @@ void Z2SoundObjMgr::searchEnemy() { twilightBattle_ = 0; #if TARGET_PC - if (Z2GetSeqMgr()->checkBgmIDPlaying(Z2BGM_MIDNA_SOS)) { + if (Z2GetSeqMgr()->checkBgmIDPlaying(Z2BGM_MIDNA_SOS) && + dusk::getSettings().game.midnasLamentNonStop) + { Z2GetSeqMgr()->changeSubBgmStatus(0); return; } From f0d6d2de68afa1f36a44de068216c5136f0790ee Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 4 Apr 2026 11:59:08 -0400 Subject: [PATCH 3/6] No Climbing Miss Animation toggle, similar to TPHD --- include/dusk/settings.h | 1 + src/d/actor/d_a_alink_hang.inc | 12 ++++++++++++ src/dusk/imgui/ImGuiMenuEnhancements.cpp | 6 ++++++ src/dusk/settings.cpp | 1 + 4 files changed, 20 insertions(+) diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 582c5a1872..ffd1016c48 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -35,6 +35,7 @@ struct UserSettings { int damageMultiplier; bool instantDeath; bool fastClimbing; + bool noMissClimbing; bool fastTears; // Preferences diff --git a/src/d/actor/d_a_alink_hang.inc b/src/d/actor/d_a_alink_hang.inc index a98020ce4f..89f11fc940 100644 --- a/src/d/actor/d_a_alink_hang.inc +++ b/src/d/actor/d_a_alink_hang.inc @@ -285,7 +285,11 @@ int daAlink_c::procHangStartInit() { offNoResetFlg2(FLG2_UNK_2000); if (checkHangFootWall()) { + #if TARGET_PC + if (!is_prev_hangReady && cM_rnd() < 0.7f && !dusk::getSettings().game.noMissClimbing) { + #else if (!is_prev_hangReady && cM_rnd() < 0.7f) { + #endif setSingleAnimeParam(ANM_CLIMB_HANG_MISS, &mpHIO->mLadder.m.mWallAttachMissAnm); field_0x3478 = mpHIO->mLadder.m.mWallAttachMissAnm.mCancelFrame; voiceStart(Z2SE_AL_V_FOOT_MISS); @@ -2084,7 +2088,11 @@ int daAlink_c::procClimbUpStartInit(int param_0) { speed.y = 0.0f; mNormalSpeed = 0.0f; + #if TARGET_PC + if (param_0 || var_r29 || cM_rnd() < 0.3f || dusk::getSettings().game.noMissClimbing) { + #else if (param_0 || var_r29 || cM_rnd() < 0.3f) { + #endif setSingleAnimeParam(ANM_CLIMB_HANG, &mpHIO->mLadder.m.mWallAttachAnm); field_0x3478 = mpHIO->mLadder.m.mWallAttachAnm.mCancelFrame; voiceStart(Z2SE_AL_V_JUMP_HANG); @@ -2161,7 +2169,11 @@ int daAlink_c::procClimbDownStartInit(s16 param_0) { deleteEquipItem(TRUE, FALSE); + #if TARGET_PC + if (cM_rnd() < 0.7f || dusk::getSettings().game.noMissClimbing) { + #else if (cM_rnd() < 0.7f) { + #endif setSingleAnimeParam(ANM_CLIMB_HANG, &mpHIO->mLadder.m.mWallAttachAnm); field_0x3478 = mpHIO->mLadder.m.mWallAttachAnm.mCancelFrame; mProcVar0.field_0x3008 = 0; diff --git a/src/dusk/imgui/ImGuiMenuEnhancements.cpp b/src/dusk/imgui/ImGuiMenuEnhancements.cpp index cf7fcc41d7..ec0a249f9f 100644 --- a/src/dusk/imgui/ImGuiMenuEnhancements.cpp +++ b/src/dusk/imgui/ImGuiMenuEnhancements.cpp @@ -37,6 +37,12 @@ namespace dusk { ImGui::SetTooltip("Quicker climbing on ladders and vines like the HD version"); } + ImGui::Checkbox("No Climbing Miss Animation", &getSettings().game.noMissClimbing); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Prevents Link from playing a struggle animation\n" + "when using the Clawshot on vines at a weird angle."); + } + ImGui::Checkbox("Faster Tears of Light", &getSettings().game.fastTears); if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Tears of Light dropped by Shadow Insects pop out faster like the HD version"); diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index ea17eef374..f39c4fd5b3 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -31,6 +31,7 @@ UserSettings g_userSettings = { .damageMultiplier = 1, .instantDeath = false, .fastClimbing = false, + .noMissClimbing = false, .fastTears = false, // Preferences From afbb41bd37bb8c3a976dbd89602f7b8903addbd2 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 4 Apr 2026 14:30:42 -0400 Subject: [PATCH 4/6] Can transform anywhere + Refactored checks to see if you can Quick Transform --- include/dusk/settings.h | 1 + src/d/actor/d_a_alink_dusk.cpp | 50 +++++++++++++----------- src/d/actor/d_a_midna.cpp | 11 ++++-- src/dusk/imgui/ImGuiMenuEnhancements.cpp | 6 +++ src/dusk/settings.cpp | 1 + 5 files changed, 44 insertions(+), 25 deletions(-) diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 582c5a1872..2de5b376eb 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -47,6 +47,7 @@ struct UserSettings { // Cheats bool enableFastIronBoots; + bool canTransformAnywhere; // Technical bool restoreWiiGlitches; diff --git a/src/d/actor/d_a_alink_dusk.cpp b/src/d/actor/d_a_alink_dusk.cpp index 83a5d592a5..95218268ac 100644 --- a/src/d/actor/d_a_alink_dusk.cpp +++ b/src/d/actor/d_a_alink_dusk.cpp @@ -19,28 +19,6 @@ void daAlink_c::handleQuickTransform() { return; } - // Make sure Link isn't riding anything (horse, boar, etc.) - if (checkRide()) { - return; - } - - switch (mProcID) { - // Make sure Link is not underwater or talking to someone. - case PROC_TALK: - case PROC_SWIM_UP: - case PROC_SWIM_DIVE: - return; - // If Link is targeting or pulling a chain, we don't want to remove the ability to use items in combat accidently. - case PROC_ATN_ACTOR_MOVE: - case PROC_ATN_ACTOR_WAIT: - case PROC_WOLF_ATN_AC_MOVE: - break; - default: - // Disable the input that was just pressed, as sometimes it could cause items to be used or Wolf Link to dig. - mDoCPd_c::getCpadInfo(PAD_1).mPressedButtonFlags = 0; - break; - } - // Ensure there is a proper pointer to the mMeterClass and mpMeterDraw structs in g_meter2_info. const auto meterClassPtr = g_meter2_info.getMeterClass(); if (!meterClassPtr) { @@ -52,18 +30,46 @@ void daAlink_c::handleQuickTransform() { return; } + mDoCPd_c::getCpadInfo(PAD_1).mPressedButtonFlags = 0; + // Ensure that the Z Button is not dimmed if (meterDrawPtr->getButtonZAlpha() != 1.f) { + Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); return; } // The game will crash if trying to quick transform while holding the Ball and Chain if (mEquipItem == dItemNo_IRONBALL_e) { + Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); return; } // Use the game's default checks for if the player can currently transform if (!m_midnaActor->checkMetamorphoseEnableBase()) { + Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + return; + } + + bool canTransform = false; + + if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && !checkMagneBootsOn()) { + if (!checkForestOldCentury()) { + if (checkMidnaRide()) { + if ((checkWolf() && + (checkModeFlg(MODE_UNK_1000) || dComIfGp_checkPlayerStatus0(0, 0x10))) || + (!checkWolf() && + (checkEventRun() || getMidnaActor()->checkMetamorphoseEnable()) && + (checkModeFlg(4) || dComIfGp_checkPlayerStatus0(0, 0x10)))) + { + canTransform = true; + } + } + } + } + + if (!canTransform) + { + Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); return; } diff --git a/src/d/actor/d_a_midna.cpp b/src/d/actor/d_a_midna.cpp index 88a5bb38bb..c63f4e5251 100644 --- a/src/d/actor/d_a_midna.cpp +++ b/src/d/actor/d_a_midna.cpp @@ -3046,12 +3046,17 @@ void daMidna_c::setMidnaNoDrawFlg() { BOOL daMidna_c::checkMetamorphoseEnableBase() { BOOL tmp; - if ( - !daAlink_getAlinkActorClass()->checkMidnaRide() || (g_env_light.mEvilInitialized & 0x80) || + 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 + (fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp) && + !dusk::getSettings().game.canTransformAnywhere) +#else fopAcIt_Judge((fopAcIt_JudgeFunc)daMidna_searchNpc, &tmp) - ) { +#endif + ) + { return FALSE; } return TRUE; diff --git a/src/dusk/imgui/ImGuiMenuEnhancements.cpp b/src/dusk/imgui/ImGuiMenuEnhancements.cpp index cf7fcc41d7..7f96becd75 100644 --- a/src/dusk/imgui/ImGuiMenuEnhancements.cpp +++ b/src/dusk/imgui/ImGuiMenuEnhancements.cpp @@ -70,6 +70,12 @@ namespace dusk { if (ImGui::BeginMenu("Cheats")) { ImGui::Checkbox("Fast Iron Boots", &getSettings().game.enableFastIronBoots); + ImGui::Checkbox("Can Transform Anywhere", + &getSettings().game.canTransformAnywhere); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Allows you to transform between forms even if NPCs are looking"); + } + ImGui::EndMenu(); } diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index ea17eef374..1ac11bdeb7 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -43,6 +43,7 @@ UserSettings g_userSettings = { // Cheats .enableFastIronBoots = false, + .canTransformAnywhere = false, // Technical .restoreWiiGlitches = false, From 845939d8b473681862ea7984287457093255ddbe Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 4 Apr 2026 14:31:16 -0400 Subject: [PATCH 5/6] removed period in description --- src/dusk/imgui/ImGuiMenuEnhancements.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dusk/imgui/ImGuiMenuEnhancements.cpp b/src/dusk/imgui/ImGuiMenuEnhancements.cpp index a0559c89b4..6a84e020c4 100644 --- a/src/dusk/imgui/ImGuiMenuEnhancements.cpp +++ b/src/dusk/imgui/ImGuiMenuEnhancements.cpp @@ -70,7 +70,7 @@ namespace dusk { if (ImGui::BeginMenu("Audio")) { ImGui::Checkbox("Non-Stop Midna's Lament", &getSettings().game.midnasLamentNonStop); if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Prevents enemy music while Midna's Lament is playing."); + ImGui::SetTooltip("Prevents enemy music while Midna's Lament is playing"); } ImGui::EndMenu(); From be2a4e4e03d9733344d5b625f1542bc165e0f830 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 4 Apr 2026 14:31:40 -0400 Subject: [PATCH 6/6] removed period in description --- src/dusk/imgui/ImGuiMenuEnhancements.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dusk/imgui/ImGuiMenuEnhancements.cpp b/src/dusk/imgui/ImGuiMenuEnhancements.cpp index ec0a249f9f..20ba760e83 100644 --- a/src/dusk/imgui/ImGuiMenuEnhancements.cpp +++ b/src/dusk/imgui/ImGuiMenuEnhancements.cpp @@ -40,7 +40,7 @@ namespace dusk { ImGui::Checkbox("No Climbing Miss Animation", &getSettings().game.noMissClimbing); if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Prevents Link from playing a struggle animation\n" - "when using the Clawshot on vines at a weird angle."); + "when using the Clawshot on vines at a weird angle"); } ImGui::Checkbox("Faster Tears of Light", &getSettings().game.fastTears);