From 729d803748c5aa2c915928b5e941814090969e2a Mon Sep 17 00:00:00 2001 From: AzodFR Date: Sat, 23 May 2026 15:44:12 +0200 Subject: [PATCH 1/2] feat(Action): add binding to load last saved state --- include/dusk/action_bindings.h | 1 + include/dusk/settings.h | 3 ++- src/dusk/action_bindings.cpp | 1 + src/dusk/imgui/ImGuiStateShare.cpp | 16 ++++++++++++++++ src/dusk/imgui/ImGuiStateShare.hpp | 1 + src/dusk/settings.cpp | 10 ++++++++++ 6 files changed, 31 insertions(+), 1 deletion(-) diff --git a/include/dusk/action_bindings.h b/include/dusk/action_bindings.h index 7eba412fe8..8d80498f88 100644 --- a/include/dusk/action_bindings.h +++ b/include/dusk/action_bindings.h @@ -11,6 +11,7 @@ enum class ActionBinds { CALL_MIDNA, OPEN_DUSKLIGHT_MENU, TURBO_SPEED_BUTTON, + LOAD_LAST_STATE, COUNT, }; diff --git a/include/dusk/settings.h b/include/dusk/settings.h index fb3704fd30..67432c8789 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -243,12 +243,13 @@ struct UserSettings { ConfigVar enableAdvancedSettings; } backend; - // Arrays of size 4 for 4 ports + // Arrays of size 5 for 4 ports struct { std::array firstPersonCamera; std::array callMidna; std::array openDusklightMenu; std::array turboSpeedButton; + std::array loadLastState; } actionBindings; }; diff --git a/src/dusk/action_bindings.cpp b/src/dusk/action_bindings.cpp index 204f219558..4e191db0f0 100644 --- a/src/dusk/action_bindings.cpp +++ b/src/dusk/action_bindings.cpp @@ -14,6 +14,7 @@ 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::LOAD_LAST_STATE, {&getSettings().actionBindings.loadLastState, "Load Last State"}}, }; return actionBinds; } diff --git a/src/dusk/imgui/ImGuiStateShare.cpp b/src/dusk/imgui/ImGuiStateShare.cpp index 27c6c74517..5635179187 100644 --- a/src/dusk/imgui/ImGuiStateShare.cpp +++ b/src/dusk/imgui/ImGuiStateShare.cpp @@ -20,6 +20,8 @@ #include #include +#include "dusk/action_bindings.h" + namespace dusk { using json = nlohmann::json; @@ -418,7 +420,21 @@ void ImGuiStateShare::draw(bool& open) { ImGui::End(); } +void ImGuiStateShare::loadLastState() { + if (!m_loaded) { + loadStatesFile(); + } + const size_t lastIdx = m_states.size() - 1; + applyEncodedState(m_states[lastIdx].encoded, m_states[lastIdx].name); +} + void ImGuiMenuTools::ShowStateShare() { + if ((dusk::IsGameLaunched || !dusk::getTransientSettings().stateShareLoadActive) && + !getSettings().game.speedrunMode + && dusk::isActionBound(dusk::ActionBinds::LOAD_LAST_STATE, 0) && + dusk::getActionBindTrig(dusk::ActionBinds::LOAD_LAST_STATE, 0)) { + m_stateShare.loadLastState(); + } if (!getSettings().backend.enableAdvancedSettings || !ImGuiConsole::CheckMenuViewToggle(ImGuiKey_F8, m_showStateShare)) { diff --git a/src/dusk/imgui/ImGuiStateShare.hpp b/src/dusk/imgui/ImGuiStateShare.hpp index a2dc681833..9ece82369f 100644 --- a/src/dusk/imgui/ImGuiStateShare.hpp +++ b/src/dusk/imgui/ImGuiStateShare.hpp @@ -16,6 +16,7 @@ struct SavedStateEntry { class ImGuiStateShare { public: void draw(bool& open); + void loadLastState(); private: std::string encodeCurrentState(); diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 4ba40d921b..77ee8fb629 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -169,6 +169,12 @@ UserSettings g_userSettings = { ActionBindConfigVar{"actionBindings.turboButton_port2", PAD_NATIVE_BUTTON_INVALID}, ActionBindConfigVar{"actionBindings.turboButton_port3", PAD_NATIVE_BUTTON_INVALID}, }, + .loadLastState { + ActionBindConfigVar{"actionBindings.loadLastState_port0", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.loadLastState_port1", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.loadLastState_port2", PAD_NATIVE_BUTTON_INVALID}, + ActionBindConfigVar{"actionBindings.loadLastState_port3", PAD_NATIVE_BUTTON_INVALID}, + }, } }; @@ -309,6 +315,10 @@ void registerSettings() { Register(g_userSettings.actionBindings.turboSpeedButton[1]); Register(g_userSettings.actionBindings.turboSpeedButton[2]); Register(g_userSettings.actionBindings.turboSpeedButton[3]); + Register(g_userSettings.actionBindings.loadLastState[0]); + Register(g_userSettings.actionBindings.loadLastState[1]); + Register(g_userSettings.actionBindings.loadLastState[2]); + Register(g_userSettings.actionBindings.loadLastState[3]); } // Transient settings From ef65f35837208fba4322ae08989f0b573061d7b0 Mon Sep 17 00:00:00 2001 From: AzodFR Date: Sat, 23 May 2026 16:32:33 +0200 Subject: [PATCH 2/2] fix: check if states list is empty --- src/dusk/imgui/ImGuiStateShare.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dusk/imgui/ImGuiStateShare.cpp b/src/dusk/imgui/ImGuiStateShare.cpp index 5635179187..acd0578e19 100644 --- a/src/dusk/imgui/ImGuiStateShare.cpp +++ b/src/dusk/imgui/ImGuiStateShare.cpp @@ -424,6 +424,9 @@ void ImGuiStateShare::loadLastState() { if (!m_loaded) { loadStatesFile(); } + if (m_states.empty()) { + return; + } const size_t lastIdx = m_states.size() - 1; applyEncodedState(m_states[lastIdx].encoded, m_states[lastIdx].name); }