From 02dc13b73a0ee614cc744a594a3cd5615e7f5d48 Mon Sep 17 00:00:00 2001 From: Nikekson Date: Thu, 25 Apr 2024 16:28:38 +0300 Subject: [PATCH 1/3] Input: Fix broken script action key assignment Fixes a bug where assigning `player x script key y` assigns the key to `player y script key x` --- src/states/StateOptions.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/states/StateOptions.cpp b/src/states/StateOptions.cpp index 8fbe6027..aa16152c 100644 --- a/src/states/StateOptions.cpp +++ b/src/states/StateOptions.cpp @@ -3236,22 +3236,20 @@ void StateOptions::sendFromMessageBox(const std::string &i_id, void StateOptions::setInputKey(const std::string &i_strKey, const std::string &i_key) { for (int i = 0; i < INPUT_NB_PLAYERS; i++) { - std::ostringstream v_n; - v_n << " " << (i + 1); + std::string v_n = " " + std::to_string(i + 1); // player keys for (unsigned int j = 0; j < INPUT_NB_PLAYERKEYS; j++) { - if (i_strKey == - Input::instance()->getPlayerKeyHelp(j, i) + v_n.str()) { + if (i_strKey == Input::instance()->getPlayerKeyHelp(j, i) + v_n) { Input::instance()->setPlayerKey(j, i, XMKey(i_key)); } } // player script keys for (unsigned int k = 0; k < MAX_SCRIPT_KEY_HOOKS; k++) { - std::ostringstream v_k; - v_k << (k + 1); - if (i_strKey == GAMETEXT_SCRIPTACTION + v_n.str() + " " + v_k.str()) { + std::string v_k = " " + std::to_string(k + 1); + + if (i_strKey == GAMETEXT_SCRIPTACTION + v_k + v_n) { Input::instance()->setSCRIPTACTION(i, k, XMKey(i_key)); } } From add44f93e8db125eda1f499c2f351a01de962f14 Mon Sep 17 00:00:00 2001 From: Nikekson Date: Thu, 25 Apr 2024 16:46:17 +0300 Subject: [PATCH 2/3] Input: Allow user-defined keys to be reset to default --- src/xmoto/input/Input.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/xmoto/input/Input.cpp b/src/xmoto/input/Input.cpp index 0044446b..fa9954eb 100644 --- a/src/xmoto/input/Input.cpp +++ b/src/xmoto/input/Input.cpp @@ -324,22 +324,27 @@ void Input::saveConfig(UserConfig *pConfig, // player keys for (unsigned int j = 0; j < INPUT_NB_PLAYERKEYS; j++) { - if (m_controls[i].playerKeys[j].key.isDefined()) { + auto &playerKey = m_controls[i].playerKeys[j]; + auto &key = playerKey.key; + + if (key.isDefined() || isANotGameSetKey(&key)) { pDb->config_setString(i_id_profile, - m_controls[i].playerKeys[j].name + v_n.str(), - m_controls[i].playerKeys[j].key.toString()); + playerKey.name + v_n.str(), + key.toString()); } } // script keys for (unsigned int k = 0; k < MAX_SCRIPT_KEY_HOOKS; k++) { - if (m_controls[i].scriptActionKeys[k].key.isDefined()) { + auto &key = m_controls[i].scriptActionKeys[k].key; + + if (key.isDefined() || isANotGameSetKey(&key)) { std::ostringstream v_k; v_k << (k); pDb->config_setString(i_id_profile, "KeyActionScript" + v_n.str() + "_" + v_k.str(), - m_controls[i].scriptActionKeys[k].key.toString()); + key.toString()); } } } From e0ddb96ce44de4ec158c24301f062ed2b8ddeb5f Mon Sep 17 00:00:00 2001 From: Nikekson Date: Thu, 25 Apr 2024 17:12:35 +0300 Subject: [PATCH 3/3] Tidy up input code changes --- src/states/StateOptions.cpp | 34 +++++++++++++++++++++------------- src/xmoto/input/Input.cpp | 13 ++++++------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/states/StateOptions.cpp b/src/states/StateOptions.cpp index aa16152c..663da001 100644 --- a/src/states/StateOptions.cpp +++ b/src/states/StateOptions.cpp @@ -2866,14 +2866,14 @@ void StateOptions::updateControlsList() { // player script keys for (unsigned int k = 0; k < MAX_SCRIPT_KEY_HOOKS; k++) { - std::ostringstream v_k; - v_k << (k + 1); - - p = pList->addEntry(GAMETEXT_SCRIPTACTION + std::string(" ") + v_k.str()); - p->Text.push_back( - Input::instance()->getSCRIPTACTION(i, k).toFancyString()); - p->Text.push_back( - Input::instance()->getSCRIPTACTION(i, k).toString()); + std::ostringstream keyName; + keyName + << GAMETEXT_SCRIPTACTION + << " " + << (k + 1); + p = pList->addEntry(keyName.str()); + p->Text.push_back(Input::instance()->getSCRIPTACTION(i, k).toFancyString()); + p->Text.push_back(Input::instance()->getSCRIPTACTION(i, k).toString()); } } } @@ -3236,20 +3236,28 @@ void StateOptions::sendFromMessageBox(const std::string &i_id, void StateOptions::setInputKey(const std::string &i_strKey, const std::string &i_key) { for (int i = 0; i < INPUT_NB_PLAYERS; i++) { - std::string v_n = " " + std::to_string(i + 1); + std::string playerNumber = std::to_string(i + 1); // player keys for (unsigned int j = 0; j < INPUT_NB_PLAYERKEYS; j++) { - if (i_strKey == Input::instance()->getPlayerKeyHelp(j, i) + v_n) { + std::string keyName = Input::instance()->getPlayerKeyHelp(j, i) + " " + playerNumber; + + if (i_strKey == keyName) { Input::instance()->setPlayerKey(j, i, XMKey(i_key)); } } // player script keys for (unsigned int k = 0; k < MAX_SCRIPT_KEY_HOOKS; k++) { - std::string v_k = " " + std::to_string(k + 1); - - if (i_strKey == GAMETEXT_SCRIPTACTION + v_k + v_n) { + std::ostringstream keyName; + keyName + << GAMETEXT_SCRIPTACTION + << " " + << (k + 1) + << " " + << playerNumber; + + if (i_strKey == keyName.str()) { Input::instance()->setSCRIPTACTION(i, k, XMKey(i_key)); } } diff --git a/src/xmoto/input/Input.cpp b/src/xmoto/input/Input.cpp index fa9954eb..7ba85286 100644 --- a/src/xmoto/input/Input.cpp +++ b/src/xmoto/input/Input.cpp @@ -95,14 +95,13 @@ void Input::loadConfig(UserConfig *pConfig, /* Get settings for mode */ for (unsigned int player = 0; player < INPUT_NB_PLAYERS; player++) { - std::ostringstream v_n; - v_n << (player + 1); + std::string playerNumber = std::to_string(player + 1); for (IFullKey &f : m_controls[player].playerKeys) { try { f.key = XMKey(pDb->config_getString(i_id_profile, - f.name + v_n.str(), + f.name + playerNumber, f.key.toString())); } catch (InvalidSystemKeyException &e) { /* keep default key */ @@ -117,11 +116,9 @@ void Input::loadConfig(UserConfig *pConfig, // script keys for (unsigned int k = 0; k < MAX_SCRIPT_KEY_HOOKS; k++) { IFullKey &f = m_controls[player].scriptActionKeys[k]; - std::ostringstream v_k; - v_k << (k); v_key = pDb->config_getString( - i_id_profile, "KeyActionScript" + v_n.str() + "_" + v_k.str(), ""); + i_id_profile, "KeyActionScript" + playerNumber + "_" + std::to_string(k), ""); if (v_key != "") { // don't override the default key if there is nothing // in the config try { @@ -407,10 +404,12 @@ bool Input::isANotGameSetKey(XMKey *i_xmkey) const { } for (unsigned int k = 0; k < MAX_SCRIPT_KEY_HOOKS; k++) { - if (m_controls[i].scriptActionKeys[k].key == *i_xmkey) + if (m_controls[i].scriptActionKeys[k].key == *i_xmkey) { return false; + } } } + return true; }