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 923a1e9fc6..91beaa470c 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -257,12 +257,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..acd0578e19 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,24 @@ void ImGuiStateShare::draw(bool& open) { ImGui::End(); } +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); +} + 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 ef639e2b05..30b8550cce 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -171,6 +171,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}, + }, } }; @@ -313,6 +319,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