From 59504730894d47d8069b91165579f9761aca4361 Mon Sep 17 00:00:00 2001 From: sera-phie Date: Sun, 24 May 2026 14:36:33 -0100 Subject: [PATCH 1/2] Allow Sun's Song & Quick Transform to be bound via the Custom Action Bindings menu along with default --- include/dusk/action_bindings.h | 2 ++ include/dusk/settings.h | 2 ++ src/dusk/action_bindings.cpp | 2 ++ src/dusk/settings.cpp | 20 ++++++++++++++++++++ src/dusk/ui/settings.cpp | 4 ++-- src/f_ap/f_ap_game.cpp | 5 +++-- 6 files changed, 31 insertions(+), 4 deletions(-) diff --git a/include/dusk/action_bindings.h b/include/dusk/action_bindings.h index 7eba412fe8..eacabb2ed7 100644 --- a/include/dusk/action_bindings.h +++ b/include/dusk/action_bindings.h @@ -11,6 +11,8 @@ enum class ActionBinds { CALL_MIDNA, OPEN_DUSKLIGHT_MENU, TURBO_SPEED_BUTTON, + QUICK_TRANSFORM, + SUN_SONG, COUNT, }; diff --git a/include/dusk/settings.h b/include/dusk/settings.h index fb3704fd30..0b3df25860 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -249,6 +249,8 @@ struct UserSettings { std::array callMidna; std::array openDusklightMenu; std::array turboSpeedButton; + std::array quickTransform; + std::array sunSong; } actionBindings; }; diff --git a/src/dusk/action_bindings.cpp b/src/dusk/action_bindings.cpp index 204f219558..5651fe9358 100644 --- a/src/dusk/action_bindings.cpp +++ b/src/dusk/action_bindings.cpp @@ -14,6 +14,8 @@ ActionBindsMap& getActionBinds() { {ActionBinds::CALL_MIDNA, {&getSettings().actionBindings.callMidna, "Call Midna"}}, {ActionBinds::OPEN_DUSKLIGHT_MENU, {&getSettings().actionBindings.openDusklightMenu, "Open Dusklight Menu"}}, {ActionBinds::TURBO_SPEED_BUTTON, {&getSettings().actionBindings.turboSpeedButton, "Turbo Speed Button"}}, + {ActionBinds::QUICK_TRANSFORM, {&getSettings().actionBindings.quickTransform, "Quick Transform"}}, + {ActionBinds::SUN_SONG, {&getSettings().actionBindings.sunSong, "Sun's Song"}}, }; return actionBinds; } diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 4ba40d921b..44f228dc6b 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -169,6 +169,18 @@ UserSettings g_userSettings = { ActionBindConfigVar{"actionBindings.turboButton_port2", PAD_NATIVE_BUTTON_INVALID}, ActionBindConfigVar{"actionBindings.turboButton_port3", PAD_NATIVE_BUTTON_INVALID}, }, + .quickTransform { + ActionBindConfigVar{"actionBindings.quickTransform_port0", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.quickTransform_port1", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.quickTransform_port2", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.quickTransform_port3", PAD_NATIVE_BUTTON_INVALID}, + }, + .sunSong { + ActionBindConfigVar{"actionBindings.sunSong_port0", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.sunSong_port1", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.sunSong_port2", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.sunSong_port3", PAD_NATIVE_BUTTON_INVALID}, + } } }; @@ -309,6 +321,14 @@ void registerSettings() { Register(g_userSettings.actionBindings.turboSpeedButton[1]); Register(g_userSettings.actionBindings.turboSpeedButton[2]); Register(g_userSettings.actionBindings.turboSpeedButton[3]); + Register(g_userSettings.actionBindings.quickTransform[0]); + Register(g_userSettings.actionBindings.quickTransform[1]); + Register(g_userSettings.actionBindings.quickTransform[2]); + Register(g_userSettings.actionBindings.quickTransform[3]); + Register(g_userSettings.actionBindings.sunSong[0]); + Register(g_userSettings.actionBindings.sunSong[1]); + Register(g_userSettings.actionBindings.sunSong[2]); + Register(g_userSettings.actionBindings.sunSong[3]); } // Transient settings diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index 42f205f12c..043ee0e5e1 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -1175,9 +1175,9 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { addOption("Show Poe Count on Map", getSettings().game.enhancedMapMenus, "Displays collected/total number of Poe Souls for a region on the map."); addSpeedrunDisabledOption("Sun's Song (R+X)", getSettings().game.sunsSong, - "Allows Wolf Link to howl and change the time of day."); + "Allows Wolf Link to howl and change the time of day.

This can also be bound to another input in Custom Action Bindings."); addOption("Quick Transform (R+Y)", getSettings().game.enableQuickTransform, - "Transform instantly by pressing R and Y simultaneously."); + "Transform instantly by pressing R and Y simultaneously.

This can also be bound to another input in Custom Action Bindings."); leftPane.add_section("Speedrunning"); config_bool_select(leftPane, rightPane, getSettings().game.speedrunMode, diff --git a/src/f_ap/f_ap_game.cpp b/src/f_ap/f_ap_game.cpp index 72219e98dd..08ba4a2487 100644 --- a/src/f_ap/f_ap_game.cpp +++ b/src/f_ap/f_ap_game.cpp @@ -29,6 +29,7 @@ #include "tracy/Tracy.hpp" #include #include +#include #endif fapGm_HIO_c::fapGm_HIO_c() { @@ -756,13 +757,13 @@ static void duskExecute() { isRecording = false; } - if (mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigX(PAD_1)) { + if (mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigX(PAD_1) || IF_DUSK(dusk::getActionBindTrig(dusk::ActionBinds::SUN_SONG, 0))) { if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { dynamic_cast(link)->handleWolfHowl(); } } - if ((mDoCPd_c::getHold(PAD_1) & (PAD_TRIGGER_R | PAD_TRIGGER_L)) == PAD_TRIGGER_R && mDoCPd_c::getTrigY(PAD_1)) { + if ((mDoCPd_c::getHold(PAD_1) & (PAD_TRIGGER_R | PAD_TRIGGER_L)) == PAD_TRIGGER_R && mDoCPd_c::getTrigY(PAD_1) || IF_DUSK(dusk::getActionBindTrig(dusk::ActionBinds::QUICK_TRANSFORM, 0))) { if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { dynamic_cast(link)->handleQuickTransform(); } From bf00d70c94ae0c91a51c2a3b503a404bc4437bdb Mon Sep 17 00:00:00 2001 From: sera-phie Date: Sun, 24 May 2026 16:05:48 -0100 Subject: [PATCH 2/2] Added Moon Jump & disabled default binds when rebound --- include/dusk/action_bindings.h | 1 + include/dusk/settings.h | 1 + src/dusk/action_bindings.cpp | 1 + src/dusk/settings.cpp | 10 ++++++++++ src/f_ap/f_ap_game.cpp | 6 +++--- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/include/dusk/action_bindings.h b/include/dusk/action_bindings.h index eacabb2ed7..5a28bd851a 100644 --- a/include/dusk/action_bindings.h +++ b/include/dusk/action_bindings.h @@ -13,6 +13,7 @@ enum class ActionBinds { TURBO_SPEED_BUTTON, QUICK_TRANSFORM, SUN_SONG, + MOON_JUMP, COUNT, }; diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 0b3df25860..0b8ff07856 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -251,6 +251,7 @@ struct UserSettings { std::array turboSpeedButton; std::array quickTransform; std::array sunSong; + std::array moonJump; } actionBindings; }; diff --git a/src/dusk/action_bindings.cpp b/src/dusk/action_bindings.cpp index 5651fe9358..ebc5f9f694 100644 --- a/src/dusk/action_bindings.cpp +++ b/src/dusk/action_bindings.cpp @@ -16,6 +16,7 @@ ActionBindsMap& getActionBinds() { {ActionBinds::TURBO_SPEED_BUTTON, {&getSettings().actionBindings.turboSpeedButton, "Turbo Speed Button"}}, {ActionBinds::QUICK_TRANSFORM, {&getSettings().actionBindings.quickTransform, "Quick Transform"}}, {ActionBinds::SUN_SONG, {&getSettings().actionBindings.sunSong, "Sun's Song"}}, + {ActionBinds::MOON_JUMP, {&getSettings().actionBindings.moonJump, "Moon Jump"}}, }; return actionBinds; } diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 44f228dc6b..5af2e4077d 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -180,6 +180,12 @@ UserSettings g_userSettings = { ActionBindConfigVar{"actionBindings.sunSong_port1", PAD_NATIVE_BUTTON_INVALID}, ActionBindConfigVar{"actionBindings.sunSong_port2", PAD_NATIVE_BUTTON_INVALID}, ActionBindConfigVar{"actionBindings.sunSong_port3", PAD_NATIVE_BUTTON_INVALID}, + }, + .moonJump { + ActionBindConfigVar{"actionBindings.moonJump_port0", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.moonJump_port1", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.moonJump_port2", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.moonJump_port3", PAD_NATIVE_BUTTON_INVALID}, } } }; @@ -329,6 +335,10 @@ void registerSettings() { Register(g_userSettings.actionBindings.sunSong[1]); Register(g_userSettings.actionBindings.sunSong[2]); Register(g_userSettings.actionBindings.sunSong[3]); + Register(g_userSettings.actionBindings.moonJump[0]); + Register(g_userSettings.actionBindings.moonJump[1]); + Register(g_userSettings.actionBindings.moonJump[2]); + Register(g_userSettings.actionBindings.moonJump[3]); } // Transient settings diff --git a/src/f_ap/f_ap_game.cpp b/src/f_ap/f_ap_game.cpp index 08ba4a2487..a459a0b41c 100644 --- a/src/f_ap/f_ap_game.cpp +++ b/src/f_ap/f_ap_game.cpp @@ -757,19 +757,19 @@ static void duskExecute() { isRecording = false; } - if (mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigX(PAD_1) || IF_DUSK(dusk::getActionBindTrig(dusk::ActionBinds::SUN_SONG, 0))) { + if (dusk::getActionBindTrig(dusk::ActionBinds::SUN_SONG, 0) || (!dusk::isActionBound(dusk::ActionBinds::SUN_SONG, 0) && mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigX(PAD_1))) { if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { dynamic_cast(link)->handleWolfHowl(); } } - if ((mDoCPd_c::getHold(PAD_1) & (PAD_TRIGGER_R | PAD_TRIGGER_L)) == PAD_TRIGGER_R && mDoCPd_c::getTrigY(PAD_1) || IF_DUSK(dusk::getActionBindTrig(dusk::ActionBinds::QUICK_TRANSFORM, 0))) { + if (dusk::getActionBindTrig(dusk::ActionBinds::QUICK_TRANSFORM, 0) || (!dusk::isActionBound(dusk::ActionBinds::QUICK_TRANSFORM, 0) && mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigY(PAD_1))) { if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { dynamic_cast(link)->handleQuickTransform(); } } - if (dusk::getSettings().game.moonJump && (mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getHoldA(PAD_1))) { + if (dusk::getActionBindTrig(dusk::ActionBinds::MOON_JUMP, 0) || (!dusk::isActionBound(dusk::ActionBinds::MOON_JUMP, 0) && mDoCPd_c::getHoldR(PAD_1) && mDoCPd_c::getTrigA(PAD_1))) { if (const auto link = g_dComIfG_gameInfo.play.getPlayer(0)) { link->speed.y = 56.0f; }