From a154e6e99dfc72636770920f497d57c278b96996 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 11 Jan 2014 12:24:18 +0300 Subject: Block moving character by arrow keys in buy/sell dialogs. Check repeat keys for action condition. --- src/input/inputmanager.cpp | 26 +++++++++++++++++++++----- src/input/inputmanager.h | 8 ++++++-- src/input/keyboarddata.h | 8 ++++---- 3 files changed, 31 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/input/inputmanager.cpp b/src/input/inputmanager.cpp index 2bc0786fb..383362eed 100644 --- a/src/input/inputmanager.cpp +++ b/src/input/inputmanager.cpp @@ -38,10 +38,12 @@ #include "gui/widgets/tabs/setup_input.h" +#include "gui/windows/buydialog.h" #include "gui/windows/chatwindow.h" #include "gui/windows/inventorywindow.h" #include "gui/windows/npcdialog.h" #include "gui/windows/npcpostdialog.h" +#include "gui/windows/selldialog.h" #include "gui/windows/setup.h" #include "gui/windows/textdialog.h" #include "gui/windows/tradewindow.h" @@ -332,7 +334,18 @@ void InputManager::callbackNewKey() mSetupInput->newKeyCallback(mNewKeyIndex); } -bool InputManager::isActionActive(const int index) +bool InputManager::isActionActive(const int index) const +{ + if (!isActionActive0(index)) + return false; + + const KeyData &key = keyData[index]; + if ((key.condition & mMask) != key.condition) + return false; + return true; +} + +bool InputManager::isActionActive0(const int index) const { if (keyboard.isActionActive(index)) return true; @@ -657,6 +670,9 @@ void InputManager::updateConditionMask() mMask |= COND_NOINPUT; } + if (!BuyDialog::isActive() && !SellDialog::isActive()) + mMask |= COND_NOBUYSELL; + if (!player_node || !player_node->getAway()) mMask |= COND_NOAWAY; @@ -676,8 +692,8 @@ void InputManager::updateConditionMask() if (!player_node || !player_node->getDisableGameModifiers()) mMask |= COND_EMODS; - if (!isActionActive(Input::KEY_STOP_ATTACK) - && !isActionActive(Input::KEY_UNTARGET)) + if (!isActionActive0(Input::KEY_STOP_ATTACK) + && !isActionActive0(Input::KEY_UNTARGET)) { mMask |= COND_NOTARGET; } @@ -690,12 +706,12 @@ void InputManager::updateConditionMask() bool InputManager::checkKey(const KeyData *const key) const { -// logger->log("mask=%d, condition=%d", mMask, key->condition); + logger->log("mask=%d, condition=%d", mMask, key->condition); if (!key || (key->condition & mMask) != key->condition) return false; return (key->modKeyIndex == Input::KEY_NO_VALUE - || isActionActive(key->modKeyIndex)); + || isActionActive0(key->modKeyIndex)); } bool InputManager::invokeKey(const KeyData *const key, const int keyNum) diff --git a/src/input/inputmanager.h b/src/input/inputmanager.h index 1a65220c6..f781a3e09 100644 --- a/src/input/inputmanager.h +++ b/src/input/inputmanager.h @@ -84,10 +84,12 @@ enum KeyCondition // pressed COND_NOFOLLOW = 1024, // follow mode disabled COND_INGAME = 2048, // game must be started + COND_NOBUYSELL = 4096, // no active buy or sell dialogs COND_SHORTCUT = 2 + 4 + 16 + 512 + 2048, // flags for shortcut keys COND_SHORTCUT0 = 2 + 4 + 16 + 512, // flags for shortcut keys COND_GAME = 2 + 4 + 8 + 16 + 64 + 2048, // main game key - COND_GAME2 = 2 + 8 + 16 + 64 + 2048 + COND_GAME2 = 2 + 8 + 16 + 64 + 2048, + COND_ARROWKEYS = 2 + 8 + 16 + 64 + 2048 + 4096 }; class InputManager final @@ -130,7 +132,7 @@ class InputManager final void unassignKey(); - static bool isActionActive(const int index) A_WARN_UNUSED; + bool isActionActive(const int index) const A_WARN_UNUSED; /** * Set the index of the new key to be assigned. @@ -174,6 +176,8 @@ class InputManager final void executeAction(const int keyNum); protected: + bool isActionActive0(const int index) const A_WARN_UNUSED; + Setup_Input *mSetupInput; /**< Reference to setup window */ int mNewKeyIndex; /**< Index of new key to be assigned */ diff --git a/src/input/keyboarddata.h b/src/input/keyboarddata.h index 5dd9e84a3..74278777f 100644 --- a/src/input/keyboarddata.h +++ b/src/input/keyboarddata.h @@ -40,28 +40,28 @@ static const KeyData keyData[Input::KEY_TOTAL] = { Input::GRP_DEFAULT, &ActionManager::moveUp, Input::KEY_NO_VALUE, 50, - COND_GAME2}, + COND_ARROWKEYS}, {"keyMoveDown", INPUT_KEYBOARD, SDLK_DOWN, INPUT_UNKNOWN, Input::KEY_NO_VALUE, Input::GRP_DEFAULT, &ActionManager::moveDown, Input::KEY_NO_VALUE, 50, - COND_GAME2}, + COND_ARROWKEYS}, {"keyMoveLeft", INPUT_KEYBOARD, SDLK_LEFT, INPUT_UNKNOWN, Input::KEY_NO_VALUE, Input::GRP_DEFAULT, &ActionManager::moveLeft, Input::KEY_NO_VALUE, 50, - COND_GAME}, + COND_ARROWKEYS}, {"keyMoveRight", INPUT_KEYBOARD, SDLK_RIGHT, INPUT_UNKNOWN, Input::KEY_NO_VALUE, Input::GRP_DEFAULT, &ActionManager::moveRight, Input::KEY_NO_VALUE, 50, - COND_GAME}, + COND_ARROWKEYS}, {"keyAttack", INPUT_KEYBOARD, SDLK_LCTRL, INPUT_UNKNOWN, Input::KEY_NO_VALUE, -- cgit v1.2.3-60-g2f50