mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-28 21:06:41 +00:00
Move input actions handling to the separate file
This commit is contained in:
parent
fcac7d3ab7
commit
ce40294124
5 changed files with 572 additions and 477 deletions
|
@ -25,7 +25,7 @@ add_openmw_dir (mwrender
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwinput
|
add_openmw_dir (mwinput
|
||||||
actions inputmanagerimp mousemanager sdlmappings sensormanager
|
actions actionmanager inputmanagerimp mousemanager sdlmappings sensormanager
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwgui
|
add_openmw_dir (mwgui
|
||||||
|
|
484
apps/openmw/mwinput/actionmanager.cpp
Normal file
484
apps/openmw/mwinput/actionmanager.cpp
Normal file
|
@ -0,0 +1,484 @@
|
||||||
|
#include "actionmanager.hpp"
|
||||||
|
|
||||||
|
#include <MyGUI_InputManager.h>
|
||||||
|
|
||||||
|
#include <SDL_keyboard.h>
|
||||||
|
|
||||||
|
#include <extern/oics/ICSInputControlSystem.h>
|
||||||
|
|
||||||
|
#include <components/settings/settings.hpp>
|
||||||
|
|
||||||
|
#include "../mwbase/inputmanager.hpp"
|
||||||
|
#include "../mwbase/statemanager.hpp"
|
||||||
|
#include "../mwbase/environment.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
#include "../mwbase/windowmanager.hpp"
|
||||||
|
#include "../mwbase/world.hpp"
|
||||||
|
|
||||||
|
#include "../mwworld/player.hpp"
|
||||||
|
#include "../mwworld/class.hpp"
|
||||||
|
#include "../mwworld/inventorystore.hpp"
|
||||||
|
#include "../mwworld/esmstore.hpp"
|
||||||
|
|
||||||
|
#include "../mwmechanics/npcstats.hpp"
|
||||||
|
#include "../mwmechanics/actorutil.hpp"
|
||||||
|
|
||||||
|
#include "actions.hpp"
|
||||||
|
|
||||||
|
namespace MWInput
|
||||||
|
{
|
||||||
|
const float ZOOM_SCALE = 120.f; /// Used for scrolling camera in and out
|
||||||
|
const int fakeDeviceID = 1;
|
||||||
|
|
||||||
|
ActionManager::ActionManager(ICS::InputControlSystem* inputBinder,
|
||||||
|
osgViewer::ScreenCaptureHandler::CaptureOperation* screenCaptureOperation,
|
||||||
|
osg::ref_ptr<osgViewer::Viewer> viewer,
|
||||||
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler)
|
||||||
|
: mInputBinder(inputBinder)
|
||||||
|
, mViewer(viewer)
|
||||||
|
, mScreenCaptureHandler(screenCaptureHandler)
|
||||||
|
, mScreenCaptureOperation(screenCaptureOperation)
|
||||||
|
, mAlwaysRunActive(Settings::Manager::getBool("always run", "Input"))
|
||||||
|
, mSneaking(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::executeAction(int action)
|
||||||
|
{
|
||||||
|
// trigger action activated
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case A_GameMenu:
|
||||||
|
toggleMainMenu ();
|
||||||
|
break;
|
||||||
|
case A_Screenshot:
|
||||||
|
screenshot();
|
||||||
|
break;
|
||||||
|
case A_Inventory:
|
||||||
|
toggleInventory ();
|
||||||
|
break;
|
||||||
|
case A_Console:
|
||||||
|
toggleConsole ();
|
||||||
|
break;
|
||||||
|
case A_Activate:
|
||||||
|
MWBase::Environment::get().getInputManager()->resetIdleTime();
|
||||||
|
activate();
|
||||||
|
break;
|
||||||
|
case A_MoveLeft:
|
||||||
|
case A_MoveRight:
|
||||||
|
case A_MoveForward:
|
||||||
|
case A_MoveBackward:
|
||||||
|
handleGuiArrowKey(action);
|
||||||
|
break;
|
||||||
|
case A_Journal:
|
||||||
|
toggleJournal ();
|
||||||
|
break;
|
||||||
|
case A_AutoMove:
|
||||||
|
toggleAutoMove ();
|
||||||
|
break;
|
||||||
|
case A_AlwaysRun:
|
||||||
|
toggleWalking ();
|
||||||
|
break;
|
||||||
|
case A_ToggleWeapon:
|
||||||
|
toggleWeapon ();
|
||||||
|
break;
|
||||||
|
case A_Rest:
|
||||||
|
rest();
|
||||||
|
break;
|
||||||
|
case A_ToggleSpell:
|
||||||
|
toggleSpell ();
|
||||||
|
break;
|
||||||
|
case A_QuickKey1:
|
||||||
|
quickKey(1);
|
||||||
|
break;
|
||||||
|
case A_QuickKey2:
|
||||||
|
quickKey(2);
|
||||||
|
break;
|
||||||
|
case A_QuickKey3:
|
||||||
|
quickKey(3);
|
||||||
|
break;
|
||||||
|
case A_QuickKey4:
|
||||||
|
quickKey(4);
|
||||||
|
break;
|
||||||
|
case A_QuickKey5:
|
||||||
|
quickKey(5);
|
||||||
|
break;
|
||||||
|
case A_QuickKey6:
|
||||||
|
quickKey(6);
|
||||||
|
break;
|
||||||
|
case A_QuickKey7:
|
||||||
|
quickKey(7);
|
||||||
|
break;
|
||||||
|
case A_QuickKey8:
|
||||||
|
quickKey(8);
|
||||||
|
break;
|
||||||
|
case A_QuickKey9:
|
||||||
|
quickKey(9);
|
||||||
|
break;
|
||||||
|
case A_QuickKey10:
|
||||||
|
quickKey(10);
|
||||||
|
break;
|
||||||
|
case A_QuickKeysMenu:
|
||||||
|
showQuickKeysMenu();
|
||||||
|
break;
|
||||||
|
case A_ToggleHUD:
|
||||||
|
MWBase::Environment::get().getWindowManager()->toggleHud();
|
||||||
|
break;
|
||||||
|
case A_ToggleDebug:
|
||||||
|
MWBase::Environment::get().getWindowManager()->toggleDebugWindow();
|
||||||
|
break;
|
||||||
|
case A_ZoomIn:
|
||||||
|
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playerviewswitch") && MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols") && !MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||||
|
MWBase::Environment::get().getWorld()->setCameraDistance(ZOOM_SCALE, true, true);
|
||||||
|
break;
|
||||||
|
case A_ZoomOut:
|
||||||
|
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playerviewswitch") && MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols") && !MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||||
|
MWBase::Environment::get().getWorld()->setCameraDistance(-ZOOM_SCALE, true, true);
|
||||||
|
break;
|
||||||
|
case A_QuickSave:
|
||||||
|
quickSave();
|
||||||
|
break;
|
||||||
|
case A_QuickLoad:
|
||||||
|
quickLoad();
|
||||||
|
break;
|
||||||
|
case A_CycleSpellLeft:
|
||||||
|
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
|
||||||
|
MWBase::Environment::get().getWindowManager()->cycleSpell(false);
|
||||||
|
break;
|
||||||
|
case A_CycleSpellRight:
|
||||||
|
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
|
||||||
|
MWBase::Environment::get().getWindowManager()->cycleSpell(true);
|
||||||
|
break;
|
||||||
|
case A_CycleWeaponLeft:
|
||||||
|
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
||||||
|
MWBase::Environment::get().getWindowManager()->cycleWeapon(false);
|
||||||
|
break;
|
||||||
|
case A_CycleWeaponRight:
|
||||||
|
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
||||||
|
MWBase::Environment::get().getWindowManager()->cycleWeapon(true);
|
||||||
|
break;
|
||||||
|
case A_Sneak:
|
||||||
|
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
|
||||||
|
if (isToggleSneak)
|
||||||
|
{
|
||||||
|
toggleSneaking();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isLeftOrRightButton(int action, ICS::InputControlSystem* ics, int deviceId, bool joystick)
|
||||||
|
{
|
||||||
|
int mouseBinding = ics->getMouseButtonBinding(ics->getControl(action), ICS::Control::INCREASE);
|
||||||
|
if (mouseBinding != ICS_MAX_DEVICE_BUTTONS)
|
||||||
|
return true;
|
||||||
|
int buttonBinding = ics->getJoystickButtonBinding(ics->getControl(action), deviceId, ICS::Control::INCREASE);
|
||||||
|
if (joystick && (buttonBinding == 0 || buttonBinding == 1))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ActionManager::checkAllowedToUseItems() const
|
||||||
|
{
|
||||||
|
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||||
|
if (player.getClass().getNpcStats(player).isWerewolf())
|
||||||
|
{
|
||||||
|
// Cannot use items or spells while in werewolf form
|
||||||
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sWerewolfRefusal}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::screenshot()
|
||||||
|
{
|
||||||
|
bool regularScreenshot = true;
|
||||||
|
|
||||||
|
std::string settingStr;
|
||||||
|
|
||||||
|
settingStr = Settings::Manager::getString("screenshot type","Video");
|
||||||
|
regularScreenshot = settingStr.size() == 0 || settingStr.compare("regular") == 0;
|
||||||
|
|
||||||
|
if (regularScreenshot)
|
||||||
|
{
|
||||||
|
mScreenCaptureHandler->setFramesToCapture(1);
|
||||||
|
mScreenCaptureHandler->captureNextFrame(*mViewer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::Image> screenshot (new osg::Image);
|
||||||
|
|
||||||
|
if (MWBase::Environment::get().getWorld()->screenshot360(screenshot.get(),settingStr))
|
||||||
|
{
|
||||||
|
(*mScreenCaptureOperation) (*(screenshot.get()),0);
|
||||||
|
// FIXME: mScreenCaptureHandler->getCaptureOperation() causes crash for some reason
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleMainMenu()
|
||||||
|
{
|
||||||
|
if (MyGUI::InputManager::getInstance().isModalAny())
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->exitCurrentModal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->toggleConsole();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!MWBase::Environment::get().getWindowManager()->isGuiMode()) //No open GUIs, open up the MainMenu
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu);
|
||||||
|
}
|
||||||
|
else //Close current GUI
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleSpell()
|
||||||
|
{
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||||
|
|
||||||
|
// Not allowed before the magic window is accessible
|
||||||
|
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playermagic") || !MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!checkAllowedToUseItems())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Not allowed if no spell selected
|
||||||
|
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||||
|
MWWorld::InventoryStore& inventory = player.getPlayer().getClass().getInventoryStore(player.getPlayer());
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->getSelectedSpell().empty() &&
|
||||||
|
inventory.getSelectedEnchantItem() == inventory.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(player.getPlayer()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
MWMechanics::DrawState_ state = player.getDrawState();
|
||||||
|
if (state == MWMechanics::DrawState_Weapon || state == MWMechanics::DrawState_Nothing)
|
||||||
|
player.setDrawState(MWMechanics::DrawState_Spell);
|
||||||
|
else
|
||||||
|
player.setDrawState(MWMechanics::DrawState_Nothing);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::quickLoad()
|
||||||
|
{
|
||||||
|
if (!MyGUI::InputManager::getInstance().isModalAny())
|
||||||
|
MWBase::Environment::get().getStateManager()->quickLoad();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::quickSave()
|
||||||
|
{
|
||||||
|
if (!MyGUI::InputManager::getInstance().isModalAny())
|
||||||
|
MWBase::Environment::get().getStateManager()->quickSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleWeapon()
|
||||||
|
{
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||||
|
|
||||||
|
// Not allowed before the inventory window is accessible
|
||||||
|
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playerfighting") || !MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||||
|
// We want to interrupt animation only if attack is preparing, but still is not triggered
|
||||||
|
// Otherwise we will get a "speedshooting" exploit, when player can skip reload animation by hitting "Toggle Weapon" key twice
|
||||||
|
if (MWBase::Environment::get().getMechanicsManager()->isAttackPreparing(player.getPlayer()))
|
||||||
|
player.setAttackingOrSpell(false);
|
||||||
|
else if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(player.getPlayer()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
MWMechanics::DrawState_ state = player.getDrawState();
|
||||||
|
if (state == MWMechanics::DrawState_Spell || state == MWMechanics::DrawState_Nothing)
|
||||||
|
player.setDrawState(MWMechanics::DrawState_Weapon);
|
||||||
|
else
|
||||||
|
player.setDrawState(MWMechanics::DrawState_Nothing);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::rest()
|
||||||
|
{
|
||||||
|
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!MWBase::Environment::get().getWindowManager()->getRestEnabled () || MWBase::Environment::get().getWindowManager()->isGuiMode ())
|
||||||
|
return;
|
||||||
|
|
||||||
|
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_Rest); //Open rest GUI
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleInventory()
|
||||||
|
{
|
||||||
|
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (MyGUI::InputManager::getInstance().isModalAny())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Toggle between game mode and inventory mode
|
||||||
|
if(!MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||||
|
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Inventory);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MWGui::GuiMode mode = MWBase::Environment::get().getWindowManager()->getMode();
|
||||||
|
if(mode == MWGui::GM_Inventory || mode == MWGui::GM_Container)
|
||||||
|
MWBase::Environment::get().getWindowManager()->popGuiMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
// .. but don't touch any other mode, except container.
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleConsole()
|
||||||
|
{
|
||||||
|
if (MyGUI::InputManager::getInstance ().isModalAny())
|
||||||
|
return;
|
||||||
|
|
||||||
|
MWBase::Environment::get().getWindowManager()->toggleConsole();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleJournal()
|
||||||
|
{
|
||||||
|
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||||
|
return;
|
||||||
|
if (MyGUI::InputManager::getInstance ().isModalAny())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_Journal
|
||||||
|
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_MainMenu
|
||||||
|
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_Settings
|
||||||
|
&& MWBase::Environment::get().getWindowManager ()->getJournalAllowed())
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Journal);
|
||||||
|
}
|
||||||
|
else if(MWBase::Environment::get().getWindowManager()->containsMode(MWGui::GM_Journal))
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Journal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::quickKey (int index)
|
||||||
|
{
|
||||||
|
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols") || !MWBase::Environment::get().getInputManager()->getControlSwitch("playerfighting") || !MWBase::Environment::get().getInputManager()->getControlSwitch("playermagic"))
|
||||||
|
return;
|
||||||
|
if (!checkAllowedToUseItems())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")!=-1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||||
|
MWBase::Environment::get().getWindowManager()->activateQuickKey (index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::showQuickKeysMenu()
|
||||||
|
{
|
||||||
|
if (!MWBase::Environment::get().getWindowManager()->isGuiMode ()
|
||||||
|
&& MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")==-1)
|
||||||
|
{
|
||||||
|
if (!checkAllowedToUseItems())
|
||||||
|
return;
|
||||||
|
|
||||||
|
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_QuickKeysMenu);
|
||||||
|
}
|
||||||
|
else if (MWBase::Environment::get().getWindowManager()->getMode () == MWGui::GM_QuickKeysMenu)
|
||||||
|
{
|
||||||
|
while(MyGUI::InputManager::getInstance().isModalAny())
|
||||||
|
{ //Handle any open Modal windows
|
||||||
|
MWBase::Environment::get().getWindowManager()->exitCurrentModal();
|
||||||
|
}
|
||||||
|
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode(); //And handle the actual main window
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::activate()
|
||||||
|
{
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||||
|
{
|
||||||
|
bool joystickUsed = MWBase::Environment::get().getInputManager()->joystickLastUsed();
|
||||||
|
if (!SDL_IsTextInputActive() && !isLeftOrRightButton(A_Activate, mInputBinder, fakeDeviceID, joystickUsed))
|
||||||
|
MWBase::Environment::get().getWindowManager()->injectKeyPress(MyGUI::KeyCode::Return, 0, false);
|
||||||
|
}
|
||||||
|
else if (MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||||
|
{
|
||||||
|
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||||
|
player.activate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleAutoMove()
|
||||||
|
{
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||||
|
|
||||||
|
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||||
|
{
|
||||||
|
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||||
|
player.setAutoMove (!player.getAutoMove());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleWalking()
|
||||||
|
{
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode() || SDL_IsTextInputActive()) return;
|
||||||
|
mAlwaysRunActive = !mAlwaysRunActive;
|
||||||
|
|
||||||
|
Settings::Manager::setBool("always run", "Input", mAlwaysRunActive);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::toggleSneaking()
|
||||||
|
{
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||||
|
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols")) return;
|
||||||
|
mSneaking = !mSneaking;
|
||||||
|
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||||
|
player.setSneak(mSneaking);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::clear()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::handleGuiArrowKey(int action)
|
||||||
|
{
|
||||||
|
bool joystickUsed = MWBase::Environment::get().getInputManager()->joystickLastUsed();
|
||||||
|
// This is currently keyboard-specific code
|
||||||
|
// TODO: see if GUI controls can be refactored into a single function
|
||||||
|
if (joystickUsed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (SDL_IsTextInputActive())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (isLeftOrRightButton(action, mInputBinder, fakeDeviceID, joystickUsed))
|
||||||
|
return;
|
||||||
|
|
||||||
|
MyGUI::KeyCode key;
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case A_MoveLeft:
|
||||||
|
key = MyGUI::KeyCode::ArrowLeft;
|
||||||
|
break;
|
||||||
|
case A_MoveRight:
|
||||||
|
key = MyGUI::KeyCode::ArrowRight;
|
||||||
|
break;
|
||||||
|
case A_MoveForward:
|
||||||
|
key = MyGUI::KeyCode::ArrowUp;
|
||||||
|
break;
|
||||||
|
case A_MoveBackward:
|
||||||
|
default:
|
||||||
|
key = MyGUI::KeyCode::ArrowDown;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
MWBase::Environment::get().getWindowManager()->injectKeyPress(key, 0, false);
|
||||||
|
}
|
||||||
|
}
|
68
apps/openmw/mwinput/actionmanager.hpp
Normal file
68
apps/openmw/mwinput/actionmanager.hpp
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#ifndef MWINPUT_ACTIONMANAGER_H
|
||||||
|
#define MWINPUT_ACTIONMANAGER_H
|
||||||
|
|
||||||
|
#include <osg/ref_ptr>
|
||||||
|
#include <osgViewer/ViewerEventHandlers>
|
||||||
|
|
||||||
|
namespace ICS
|
||||||
|
{
|
||||||
|
class InputControlSystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace osgViewer
|
||||||
|
{
|
||||||
|
class Viewer;
|
||||||
|
class ScreenCaptureHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace MWInput
|
||||||
|
{
|
||||||
|
class ActionManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ActionManager(ICS::InputControlSystem* inputBinder,
|
||||||
|
osgViewer::ScreenCaptureHandler::CaptureOperation* screenCaptureOperation,
|
||||||
|
osg::ref_ptr<osgViewer::Viewer> viewer,
|
||||||
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler);
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
void executeAction(int action);
|
||||||
|
|
||||||
|
bool checkAllowedToUseItems() const;
|
||||||
|
|
||||||
|
void toggleMainMenu();
|
||||||
|
void toggleSpell();
|
||||||
|
void toggleWeapon();
|
||||||
|
void toggleInventory();
|
||||||
|
void toggleConsole();
|
||||||
|
void screenshot();
|
||||||
|
void toggleJournal();
|
||||||
|
void activate();
|
||||||
|
void toggleWalking();
|
||||||
|
void toggleSneaking();
|
||||||
|
void toggleAutoMove();
|
||||||
|
void rest();
|
||||||
|
void quickLoad();
|
||||||
|
void quickSave();
|
||||||
|
|
||||||
|
void quickKey (int index);
|
||||||
|
void showQuickKeysMenu();
|
||||||
|
|
||||||
|
bool isAlwaysRunActive() const { return mAlwaysRunActive; };
|
||||||
|
bool isSneaking() const { return mSneaking; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
void handleGuiArrowKey(int action);
|
||||||
|
|
||||||
|
ICS::InputControlSystem* mInputBinder;
|
||||||
|
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||||
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
||||||
|
osgViewer::ScreenCaptureHandler::CaptureOperation* mScreenCaptureOperation;
|
||||||
|
|
||||||
|
bool mAlwaysRunActive;
|
||||||
|
bool mSneaking;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -30,6 +30,7 @@
|
||||||
#include "../mwmechanics/npcstats.hpp"
|
#include "../mwmechanics/npcstats.hpp"
|
||||||
#include "../mwmechanics/actorutil.hpp"
|
#include "../mwmechanics/actorutil.hpp"
|
||||||
|
|
||||||
|
#include "actionmanager.hpp"
|
||||||
#include "mousemanager.hpp"
|
#include "mousemanager.hpp"
|
||||||
#include "sdlmappings.hpp"
|
#include "sdlmappings.hpp"
|
||||||
#include "sensormanager.hpp"
|
#include "sensormanager.hpp"
|
||||||
|
@ -41,14 +42,10 @@ namespace MWInput
|
||||||
osg::ref_ptr<osgViewer::Viewer> viewer,
|
osg::ref_ptr<osgViewer::Viewer> viewer,
|
||||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler,
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler,
|
||||||
osgViewer::ScreenCaptureHandler::CaptureOperation *screenCaptureOperation,
|
osgViewer::ScreenCaptureHandler::CaptureOperation *screenCaptureOperation,
|
||||||
const std::string& userFile, bool userFileExists,
|
const std::string& userFile, bool userFileExists, const std::string& userControllerBindingsFile,
|
||||||
const std::string& userControllerBindingsFile,
|
|
||||||
const std::string& controllerBindingsFile, bool grab)
|
const std::string& controllerBindingsFile, bool grab)
|
||||||
: mWindow(window)
|
: mWindow(window)
|
||||||
, mWindowVisible(true)
|
, mWindowVisible(true)
|
||||||
, mViewer(viewer)
|
|
||||||
, mScreenCaptureHandler(screenCaptureHandler)
|
|
||||||
, mScreenCaptureOperation(screenCaptureOperation)
|
|
||||||
, mJoystickLastUsed(false)
|
, mJoystickLastUsed(false)
|
||||||
, mPlayer(nullptr)
|
, mPlayer(nullptr)
|
||||||
, mInputManager(nullptr)
|
, mInputManager(nullptr)
|
||||||
|
@ -56,8 +53,6 @@ namespace MWInput
|
||||||
, mUserFile(userFile)
|
, mUserFile(userFile)
|
||||||
, mDragDrop(false)
|
, mDragDrop(false)
|
||||||
, mGrabCursor (Settings::Manager::getBool("grab cursor", "Input"))
|
, mGrabCursor (Settings::Manager::getBool("grab cursor", "Input"))
|
||||||
, mInvertX (Settings::Manager::getBool("invert x axis", "Input"))
|
|
||||||
, mInvertY (Settings::Manager::getBool("invert y axis", "Input"))
|
|
||||||
, mControlsDisabled(false)
|
, mControlsDisabled(false)
|
||||||
, mJoystickEnabled (Settings::Manager::getBool("enable controller", "Input"))
|
, mJoystickEnabled (Settings::Manager::getBool("enable controller", "Input"))
|
||||||
, mPreviewPOVDelay(0.f)
|
, mPreviewPOVDelay(0.f)
|
||||||
|
@ -67,12 +62,8 @@ namespace MWInput
|
||||||
, mDetectingKeyboard(false)
|
, mDetectingKeyboard(false)
|
||||||
, mOverencumberedMessageDelay(0.f)
|
, mOverencumberedMessageDelay(0.f)
|
||||||
, mGamepadZoom(0)
|
, mGamepadZoom(0)
|
||||||
, mUserFileExists(userFileExists)
|
|
||||||
, mAlwaysRunActive(Settings::Manager::getBool("always run", "Input"))
|
|
||||||
, mSneakToggles(Settings::Manager::getBool("toggle sneak", "Input"))
|
|
||||||
, mSneakToggleShortcutTimer(0.f)
|
, mSneakToggleShortcutTimer(0.f)
|
||||||
, mSneakGamepadShortcut(false)
|
, mSneakGamepadShortcut(false)
|
||||||
, mSneaking(false)
|
|
||||||
, mAttemptJump(false)
|
, mAttemptJump(false)
|
||||||
, mGamepadCursorSpeed(Settings::Manager::getFloat("gamepad cursor speed", "Input"))
|
, mGamepadCursorSpeed(Settings::Manager::getFloat("gamepad cursor speed", "Input"))
|
||||||
, mFakeDeviceID(1)
|
, mFakeDeviceID(1)
|
||||||
|
@ -139,6 +130,8 @@ namespace MWInput
|
||||||
|
|
||||||
mMouseManager = new MouseManager(mInputBinder, mInputManager, window);
|
mMouseManager = new MouseManager(mInputBinder, mInputManager, window);
|
||||||
mInputManager->setMouseEventCallback (mMouseManager);
|
mInputManager->setMouseEventCallback (mMouseManager);
|
||||||
|
|
||||||
|
mActionManager = new ActionManager(mInputBinder, screenCaptureOperation, viewer, screenCaptureHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputManager::clear()
|
void InputManager::clear()
|
||||||
|
@ -147,6 +140,7 @@ namespace MWInput
|
||||||
for (std::map<std::string, bool>::iterator it = mControlSwitch.begin(); it != mControlSwitch.end(); ++it)
|
for (std::map<std::string, bool>::iterator it = mControlSwitch.begin(); it != mControlSwitch.end(); ++it)
|
||||||
it->second = true;
|
it->second = true;
|
||||||
|
|
||||||
|
mActionManager->clear();
|
||||||
mSensorManager->clear();
|
mSensorManager->clear();
|
||||||
mMouseManager->clear();
|
mMouseManager->clear();
|
||||||
}
|
}
|
||||||
|
@ -155,6 +149,8 @@ namespace MWInput
|
||||||
{
|
{
|
||||||
mInputBinder->save (mUserFile);
|
mInputBinder->save (mUserFile);
|
||||||
|
|
||||||
|
delete mActionManager;
|
||||||
|
delete mMouseManager;
|
||||||
delete mSensorManager;
|
delete mSensorManager;
|
||||||
|
|
||||||
delete mInputBinder;
|
delete mInputBinder;
|
||||||
|
@ -183,51 +179,6 @@ namespace MWInput
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isLeftOrRightButton(int action, ICS::InputControlSystem* ics, int deviceId, bool joystick)
|
|
||||||
{
|
|
||||||
int mouseBinding = ics->getMouseButtonBinding(ics->getControl(action), ICS::Control::INCREASE);
|
|
||||||
if (mouseBinding != ICS_MAX_DEVICE_BUTTONS)
|
|
||||||
return true;
|
|
||||||
int buttonBinding = ics->getJoystickButtonBinding(ics->getControl(action), deviceId, ICS::Control::INCREASE);
|
|
||||||
if (joystick && (buttonBinding == 0 || buttonBinding == 1))
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::handleGuiArrowKey(int action)
|
|
||||||
{
|
|
||||||
// This is currently keyboard-specific code
|
|
||||||
// TODO: see if GUI controls can be refactored into a single function
|
|
||||||
if (mJoystickLastUsed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (SDL_IsTextInputActive())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (isLeftOrRightButton(action, mInputBinder, mFakeDeviceID, mJoystickLastUsed))
|
|
||||||
return;
|
|
||||||
|
|
||||||
MyGUI::KeyCode key;
|
|
||||||
switch (action)
|
|
||||||
{
|
|
||||||
case A_MoveLeft:
|
|
||||||
key = MyGUI::KeyCode::ArrowLeft;
|
|
||||||
break;
|
|
||||||
case A_MoveRight:
|
|
||||||
key = MyGUI::KeyCode::ArrowRight;
|
|
||||||
break;
|
|
||||||
case A_MoveForward:
|
|
||||||
key = MyGUI::KeyCode::ArrowUp;
|
|
||||||
break;
|
|
||||||
case A_MoveBackward:
|
|
||||||
default:
|
|
||||||
key = MyGUI::KeyCode::ArrowDown;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
MWBase::Environment::get().getWindowManager()->injectKeyPress(key, 0, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InputManager::gamepadToGuiControl(const SDL_ControllerButtonEvent &arg)
|
bool InputManager::gamepadToGuiControl(const SDL_ControllerButtonEvent &arg)
|
||||||
{
|
{
|
||||||
// Presumption of GUI mode will be removed in the future.
|
// Presumption of GUI mode will be removed in the future.
|
||||||
|
@ -375,127 +326,7 @@ namespace MWInput
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentValue == 1)
|
if (currentValue == 1)
|
||||||
{
|
mActionManager->executeAction(action);
|
||||||
// trigger action activated
|
|
||||||
switch (action)
|
|
||||||
{
|
|
||||||
case A_GameMenu:
|
|
||||||
toggleMainMenu ();
|
|
||||||
break;
|
|
||||||
case A_Screenshot:
|
|
||||||
screenshot();
|
|
||||||
break;
|
|
||||||
case A_Inventory:
|
|
||||||
toggleInventory ();
|
|
||||||
break;
|
|
||||||
case A_Console:
|
|
||||||
toggleConsole ();
|
|
||||||
break;
|
|
||||||
case A_Activate:
|
|
||||||
resetIdleTime();
|
|
||||||
activate();
|
|
||||||
break;
|
|
||||||
case A_MoveLeft:
|
|
||||||
case A_MoveRight:
|
|
||||||
case A_MoveForward:
|
|
||||||
case A_MoveBackward:
|
|
||||||
handleGuiArrowKey(action);
|
|
||||||
break;
|
|
||||||
case A_Journal:
|
|
||||||
toggleJournal ();
|
|
||||||
break;
|
|
||||||
case A_AutoMove:
|
|
||||||
toggleAutoMove ();
|
|
||||||
break;
|
|
||||||
case A_AlwaysRun:
|
|
||||||
toggleWalking ();
|
|
||||||
break;
|
|
||||||
case A_ToggleWeapon:
|
|
||||||
toggleWeapon ();
|
|
||||||
break;
|
|
||||||
case A_Rest:
|
|
||||||
rest();
|
|
||||||
break;
|
|
||||||
case A_ToggleSpell:
|
|
||||||
toggleSpell ();
|
|
||||||
break;
|
|
||||||
case A_QuickKey1:
|
|
||||||
quickKey(1);
|
|
||||||
break;
|
|
||||||
case A_QuickKey2:
|
|
||||||
quickKey(2);
|
|
||||||
break;
|
|
||||||
case A_QuickKey3:
|
|
||||||
quickKey(3);
|
|
||||||
break;
|
|
||||||
case A_QuickKey4:
|
|
||||||
quickKey(4);
|
|
||||||
break;
|
|
||||||
case A_QuickKey5:
|
|
||||||
quickKey(5);
|
|
||||||
break;
|
|
||||||
case A_QuickKey6:
|
|
||||||
quickKey(6);
|
|
||||||
break;
|
|
||||||
case A_QuickKey7:
|
|
||||||
quickKey(7);
|
|
||||||
break;
|
|
||||||
case A_QuickKey8:
|
|
||||||
quickKey(8);
|
|
||||||
break;
|
|
||||||
case A_QuickKey9:
|
|
||||||
quickKey(9);
|
|
||||||
break;
|
|
||||||
case A_QuickKey10:
|
|
||||||
quickKey(10);
|
|
||||||
break;
|
|
||||||
case A_QuickKeysMenu:
|
|
||||||
showQuickKeysMenu();
|
|
||||||
break;
|
|
||||||
case A_ToggleHUD:
|
|
||||||
MWBase::Environment::get().getWindowManager()->toggleHud();
|
|
||||||
break;
|
|
||||||
case A_ToggleDebug:
|
|
||||||
MWBase::Environment::get().getWindowManager()->toggleDebugWindow();
|
|
||||||
break;
|
|
||||||
case A_ZoomIn:
|
|
||||||
if (mControlSwitch["playerviewswitch"] && mControlSwitch["playercontrols"] && !MWBase::Environment::get().getWindowManager()->isGuiMode())
|
|
||||||
MWBase::Environment::get().getWorld()->setCameraDistance(ZOOM_SCALE, true, true);
|
|
||||||
break;
|
|
||||||
case A_ZoomOut:
|
|
||||||
if (mControlSwitch["playerviewswitch"] && mControlSwitch["playercontrols"] && !MWBase::Environment::get().getWindowManager()->isGuiMode())
|
|
||||||
MWBase::Environment::get().getWorld()->setCameraDistance(-ZOOM_SCALE, true, true);
|
|
||||||
break;
|
|
||||||
case A_QuickSave:
|
|
||||||
quickSave();
|
|
||||||
break;
|
|
||||||
case A_QuickLoad:
|
|
||||||
quickLoad();
|
|
||||||
break;
|
|
||||||
case A_CycleSpellLeft:
|
|
||||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
|
|
||||||
MWBase::Environment::get().getWindowManager()->cycleSpell(false);
|
|
||||||
break;
|
|
||||||
case A_CycleSpellRight:
|
|
||||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
|
|
||||||
MWBase::Environment::get().getWindowManager()->cycleSpell(true);
|
|
||||||
break;
|
|
||||||
case A_CycleWeaponLeft:
|
|
||||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
|
||||||
MWBase::Environment::get().getWindowManager()->cycleWeapon(false);
|
|
||||||
break;
|
|
||||||
case A_CycleWeaponRight:
|
|
||||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
|
||||||
MWBase::Environment::get().getWindowManager()->cycleWeapon(true);
|
|
||||||
break;
|
|
||||||
case A_Sneak:
|
|
||||||
if (mSneakToggles)
|
|
||||||
{
|
|
||||||
toggleSneaking();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputManager::updateCursorMode()
|
void InputManager::updateCursorMode()
|
||||||
|
@ -521,18 +352,6 @@ namespace MWInput
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InputManager::checkAllowedToUseItems() const
|
|
||||||
{
|
|
||||||
MWWorld::Ptr player = MWMechanics::getPlayer();
|
|
||||||
if (player.getClass().getNpcStats(player).isWerewolf())
|
|
||||||
{
|
|
||||||
// Cannot use items or spells while in werewolf form
|
|
||||||
MWBase::Environment::get().getWindowManager()->messageBox("#{sWerewolfRefusal}");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::update(float dt, bool disableControls, bool disableEvents)
|
void InputManager::update(float dt, bool disableControls, bool disableEvents)
|
||||||
{
|
{
|
||||||
mControlsDisabled = disableControls;
|
mControlsDisabled = disableControls;
|
||||||
|
@ -638,7 +457,8 @@ namespace MWInput
|
||||||
mPlayer->setForwardBackward (1);
|
mPlayer->setForwardBackward (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mSneakToggles)
|
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
|
||||||
|
if (!isToggleSneak)
|
||||||
{
|
{
|
||||||
if(mJoystickLastUsed)
|
if(mJoystickLastUsed)
|
||||||
{
|
{
|
||||||
|
@ -649,20 +469,20 @@ namespace MWInput
|
||||||
if(mSneakToggleShortcutTimer <= 0.3f)
|
if(mSneakToggleShortcutTimer <= 0.3f)
|
||||||
{
|
{
|
||||||
mSneakGamepadShortcut = true;
|
mSneakGamepadShortcut = true;
|
||||||
toggleSneaking();
|
mActionManager->toggleSneaking();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
mSneakGamepadShortcut = false;
|
mSneakGamepadShortcut = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!mSneaking)
|
if(!mActionManager->isSneaking())
|
||||||
toggleSneaking();
|
mActionManager->toggleSneaking();
|
||||||
mSneakToggleShortcutTimer = 0.f;
|
mSneakToggleShortcutTimer = 0.f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(!mSneakGamepadShortcut && mSneaking)
|
if(!mSneakGamepadShortcut && mActionManager->isSneaking())
|
||||||
toggleSneaking();
|
mActionManager->toggleSneaking();
|
||||||
if(mSneakToggleShortcutTimer <= 0.3f)
|
if(mSneakToggleShortcutTimer <= 0.3f)
|
||||||
mSneakToggleShortcutTimer += dt;
|
mSneakToggleShortcutTimer += dt;
|
||||||
}
|
}
|
||||||
|
@ -678,7 +498,7 @@ namespace MWInput
|
||||||
mOverencumberedMessageDelay = 0.f;
|
mOverencumberedMessageDelay = 0.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mAlwaysRunActive && alwaysRunAllowed) || isRunning)
|
if ((mActionManager->isAlwaysRunActive() && alwaysRunAllowed) || isRunning)
|
||||||
mPlayer->setRunState(!actionIsActive(A_Run));
|
mPlayer->setRunState(!actionIsActive(A_Run));
|
||||||
else
|
else
|
||||||
mPlayer->setRunState(actionIsActive(A_Run));
|
mPlayer->setRunState(actionIsActive(A_Run));
|
||||||
|
@ -773,12 +593,6 @@ namespace MWInput
|
||||||
for (Settings::CategorySettingVector::const_iterator it = changed.begin();
|
for (Settings::CategorySettingVector::const_iterator it = changed.begin();
|
||||||
it != changed.end(); ++it)
|
it != changed.end(); ++it)
|
||||||
{
|
{
|
||||||
if (it->first == "Input" && it->second == "invert x axis")
|
|
||||||
mInvertX = Settings::Manager::getBool("invert x axis", "Input");
|
|
||||||
|
|
||||||
if (it->first == "Input" && it->second == "invert y axis")
|
|
||||||
mInvertY = Settings::Manager::getBool("invert y axis", "Input");
|
|
||||||
|
|
||||||
if (it->first == "Input" && it->second == "grab cursor")
|
if (it->first == "Input" && it->second == "grab cursor")
|
||||||
mGrabCursor = Settings::Manager::getBool("grab cursor", "Input");
|
mGrabCursor = Settings::Manager::getBool("grab cursor", "Input");
|
||||||
|
|
||||||
|
@ -808,6 +622,7 @@ namespace MWInput
|
||||||
Settings::Manager::getBool("window border", "Video"));
|
Settings::Manager::getBool("window border", "Video"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mMouseManager->processChangedSettings(changed);
|
||||||
mSensorManager->processChangedSettings(changed);
|
mSensorManager->processChangedSettings(changed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1022,246 +837,6 @@ namespace MWInput
|
||||||
MWBase::Environment::get().getStateManager()->requestQuit();
|
MWBase::Environment::get().getStateManager()->requestQuit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputManager::toggleMainMenu()
|
|
||||||
{
|
|
||||||
if (MyGUI::InputManager::getInstance().isModalAny())
|
|
||||||
{
|
|
||||||
MWBase::Environment::get().getWindowManager()->exitCurrentModal();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
|
||||||
{
|
|
||||||
MWBase::Environment::get().getWindowManager()->toggleConsole();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode()) //No open GUIs, open up the MainMenu
|
|
||||||
{
|
|
||||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu);
|
|
||||||
}
|
|
||||||
else //Close current GUI
|
|
||||||
{
|
|
||||||
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::quickLoad() {
|
|
||||||
if (!MyGUI::InputManager::getInstance().isModalAny())
|
|
||||||
MWBase::Environment::get().getStateManager()->quickLoad();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::quickSave() {
|
|
||||||
if (!MyGUI::InputManager::getInstance().isModalAny())
|
|
||||||
MWBase::Environment::get().getStateManager()->quickSave();
|
|
||||||
}
|
|
||||||
void InputManager::toggleSpell()
|
|
||||||
{
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
|
||||||
|
|
||||||
// Not allowed before the magic window is accessible
|
|
||||||
if (!mControlSwitch["playermagic"] || !mControlSwitch["playercontrols"])
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!checkAllowedToUseItems())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Not allowed if no spell selected
|
|
||||||
MWWorld::InventoryStore& inventory = mPlayer->getPlayer().getClass().getInventoryStore(mPlayer->getPlayer());
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->getSelectedSpell().empty() &&
|
|
||||||
inventory.getSelectedEnchantItem() == inventory.end())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(mPlayer->getPlayer()))
|
|
||||||
return;
|
|
||||||
|
|
||||||
MWMechanics::DrawState_ state = mPlayer->getDrawState();
|
|
||||||
if (state == MWMechanics::DrawState_Weapon || state == MWMechanics::DrawState_Nothing)
|
|
||||||
mPlayer->setDrawState(MWMechanics::DrawState_Spell);
|
|
||||||
else
|
|
||||||
mPlayer->setDrawState(MWMechanics::DrawState_Nothing);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::toggleWeapon()
|
|
||||||
{
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
|
||||||
|
|
||||||
// Not allowed before the inventory window is accessible
|
|
||||||
if (!mControlSwitch["playerfighting"] || !mControlSwitch["playercontrols"])
|
|
||||||
return;
|
|
||||||
|
|
||||||
// We want to interrupt animation only if attack is preparing, but still is not triggered
|
|
||||||
// Otherwise we will get a "speedshooting" exploit, when player can skip reload animation by hitting "Toggle Weapon" key twice
|
|
||||||
if (MWBase::Environment::get().getMechanicsManager()->isAttackPreparing(mPlayer->getPlayer()))
|
|
||||||
mPlayer->setAttackingOrSpell(false);
|
|
||||||
else if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(mPlayer->getPlayer()))
|
|
||||||
return;
|
|
||||||
|
|
||||||
MWMechanics::DrawState_ state = mPlayer->getDrawState();
|
|
||||||
if (state == MWMechanics::DrawState_Spell || state == MWMechanics::DrawState_Nothing)
|
|
||||||
mPlayer->setDrawState(MWMechanics::DrawState_Weapon);
|
|
||||||
else
|
|
||||||
mPlayer->setDrawState(MWMechanics::DrawState_Nothing);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::rest()
|
|
||||||
{
|
|
||||||
if (!mControlSwitch["playercontrols"])
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!MWBase::Environment::get().getWindowManager()->getRestEnabled () || MWBase::Environment::get().getWindowManager()->isGuiMode ())
|
|
||||||
return;
|
|
||||||
|
|
||||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_Rest); //Open rest GUI
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::screenshot()
|
|
||||||
{
|
|
||||||
bool regularScreenshot = true;
|
|
||||||
|
|
||||||
std::string settingStr;
|
|
||||||
|
|
||||||
settingStr = Settings::Manager::getString("screenshot type","Video");
|
|
||||||
regularScreenshot = settingStr.size() == 0 || settingStr.compare("regular") == 0;
|
|
||||||
|
|
||||||
if (regularScreenshot)
|
|
||||||
{
|
|
||||||
mScreenCaptureHandler->setFramesToCapture(1);
|
|
||||||
mScreenCaptureHandler->captureNextFrame(*mViewer);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
osg::ref_ptr<osg::Image> screenshot (new osg::Image);
|
|
||||||
|
|
||||||
if (MWBase::Environment::get().getWorld()->screenshot360(screenshot.get(),settingStr))
|
|
||||||
{
|
|
||||||
(*mScreenCaptureOperation) (*(screenshot.get()),0);
|
|
||||||
// FIXME: mScreenCaptureHandler->getCaptureOperation() causes crash for some reason
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::toggleInventory()
|
|
||||||
{
|
|
||||||
if (!mControlSwitch["playercontrols"])
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (MyGUI::InputManager::getInstance ().isModalAny())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Toggle between game mode and inventory mode
|
|
||||||
if(!MWBase::Environment::get().getWindowManager()->isGuiMode())
|
|
||||||
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Inventory);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MWGui::GuiMode mode = MWBase::Environment::get().getWindowManager()->getMode();
|
|
||||||
if(mode == MWGui::GM_Inventory || mode == MWGui::GM_Container)
|
|
||||||
MWBase::Environment::get().getWindowManager()->popGuiMode();
|
|
||||||
}
|
|
||||||
|
|
||||||
// .. but don't touch any other mode, except container.
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::toggleConsole()
|
|
||||||
{
|
|
||||||
if (MyGUI::InputManager::getInstance ().isModalAny())
|
|
||||||
return;
|
|
||||||
|
|
||||||
MWBase::Environment::get().getWindowManager()->toggleConsole();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::toggleJournal()
|
|
||||||
{
|
|
||||||
if (!mControlSwitch["playercontrols"])
|
|
||||||
return;
|
|
||||||
if (MyGUI::InputManager::getInstance ().isModalAny())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_Journal
|
|
||||||
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_MainMenu
|
|
||||||
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_Settings
|
|
||||||
&& MWBase::Environment::get().getWindowManager ()->getJournalAllowed())
|
|
||||||
{
|
|
||||||
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Journal);
|
|
||||||
}
|
|
||||||
else if(MWBase::Environment::get().getWindowManager()->containsMode(MWGui::GM_Journal))
|
|
||||||
{
|
|
||||||
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Journal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::quickKey (int index)
|
|
||||||
{
|
|
||||||
if (!mControlSwitch["playercontrols"] || !mControlSwitch["playerfighting"] || !mControlSwitch["playermagic"])
|
|
||||||
return;
|
|
||||||
if (!checkAllowedToUseItems())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")!=-1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode())
|
|
||||||
MWBase::Environment::get().getWindowManager()->activateQuickKey (index);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::showQuickKeysMenu()
|
|
||||||
{
|
|
||||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode ()
|
|
||||||
&& MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")==-1)
|
|
||||||
{
|
|
||||||
if (!checkAllowedToUseItems())
|
|
||||||
return;
|
|
||||||
|
|
||||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_QuickKeysMenu);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (MWBase::Environment::get().getWindowManager()->getMode () == MWGui::GM_QuickKeysMenu) {
|
|
||||||
while(MyGUI::InputManager::getInstance().isModalAny()) { //Handle any open Modal windows
|
|
||||||
MWBase::Environment::get().getWindowManager()->exitCurrentModal();
|
|
||||||
}
|
|
||||||
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode(); //And handle the actual main window
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::activate()
|
|
||||||
{
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode())
|
|
||||||
{
|
|
||||||
if (!SDL_IsTextInputActive() && !isLeftOrRightButton(A_Activate, mInputBinder, mFakeDeviceID, mJoystickLastUsed))
|
|
||||||
MWBase::Environment::get().getWindowManager()->injectKeyPress(MyGUI::KeyCode::Return, 0, false);
|
|
||||||
}
|
|
||||||
else if (mControlSwitch["playercontrols"])
|
|
||||||
mPlayer->activate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::toggleAutoMove()
|
|
||||||
{
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
|
||||||
|
|
||||||
if (mControlSwitch["playercontrols"])
|
|
||||||
mPlayer->setAutoMove (!mPlayer->getAutoMove());
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::toggleWalking()
|
|
||||||
{
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode() || SDL_IsTextInputActive()) return;
|
|
||||||
mAlwaysRunActive = !mAlwaysRunActive;
|
|
||||||
|
|
||||||
Settings::Manager::setBool("always run", "Input", mAlwaysRunActive);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::toggleSneaking()
|
|
||||||
{
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
|
||||||
if (!mControlSwitch["playercontrols"]) return;
|
|
||||||
mSneaking = !mSneaking;
|
|
||||||
mPlayer->setSneak(mSneaking);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::resetIdleTime()
|
void InputManager::resetIdleTime()
|
||||||
{
|
{
|
||||||
if (mTimeIdle < 0)
|
if (mTimeIdle < 0)
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
namespace MWInput
|
namespace MWInput
|
||||||
{
|
{
|
||||||
|
class ActionManager;
|
||||||
class MouseManager;
|
class MouseManager;
|
||||||
class SensorManager;
|
class SensorManager;
|
||||||
}
|
}
|
||||||
|
@ -51,18 +52,10 @@ namespace SDLUtil
|
||||||
class VideoWrapper;
|
class VideoWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace osgViewer
|
|
||||||
{
|
|
||||||
class Viewer;
|
|
||||||
class ScreenCaptureHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SDL_Window;
|
struct SDL_Window;
|
||||||
|
|
||||||
namespace MWInput
|
namespace MWInput
|
||||||
{
|
{
|
||||||
const float ZOOM_SCALE = 120.f; /// Used for scrolling camera in and out
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Class that handles all input and key bindings for OpenMW.
|
* @brief Class that handles all input and key bindings for OpenMW.
|
||||||
*/
|
*/
|
||||||
|
@ -167,9 +160,6 @@ namespace MWInput
|
||||||
private:
|
private:
|
||||||
SDL_Window* mWindow;
|
SDL_Window* mWindow;
|
||||||
bool mWindowVisible;
|
bool mWindowVisible;
|
||||||
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
|
||||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
|
||||||
osgViewer::ScreenCaptureHandler::CaptureOperation *mScreenCaptureOperation;
|
|
||||||
|
|
||||||
bool mJoystickLastUsed;
|
bool mJoystickLastUsed;
|
||||||
MWWorld::Player* mPlayer;
|
MWWorld::Player* mPlayer;
|
||||||
|
@ -185,9 +175,6 @@ namespace MWInput
|
||||||
|
|
||||||
bool mGrabCursor;
|
bool mGrabCursor;
|
||||||
|
|
||||||
bool mInvertX;
|
|
||||||
bool mInvertY;
|
|
||||||
|
|
||||||
bool mControlsDisabled;
|
bool mControlsDisabled;
|
||||||
bool mJoystickEnabled;
|
bool mJoystickEnabled;
|
||||||
|
|
||||||
|
@ -202,12 +189,9 @@ namespace MWInput
|
||||||
float mOverencumberedMessageDelay;
|
float mOverencumberedMessageDelay;
|
||||||
|
|
||||||
float mGamepadZoom;
|
float mGamepadZoom;
|
||||||
bool mUserFileExists;
|
|
||||||
bool mAlwaysRunActive;
|
|
||||||
bool mSneakToggles;
|
bool mSneakToggles;
|
||||||
float mSneakToggleShortcutTimer;
|
float mSneakToggleShortcutTimer;
|
||||||
bool mSneakGamepadShortcut;
|
bool mSneakGamepadShortcut;
|
||||||
bool mSneaking;
|
|
||||||
bool mAttemptJump;
|
bool mAttemptJump;
|
||||||
|
|
||||||
std::map<std::string, bool> mControlSwitch;
|
std::map<std::string, bool> mControlSwitch;
|
||||||
|
@ -215,6 +199,7 @@ namespace MWInput
|
||||||
float mInvUiScalingFactor;
|
float mInvUiScalingFactor;
|
||||||
float mGamepadCursorSpeed;
|
float mGamepadCursorSpeed;
|
||||||
|
|
||||||
|
ActionManager* mActionManager;
|
||||||
MouseManager* mMouseManager;
|
MouseManager* mMouseManager;
|
||||||
SensorManager* mSensorManager;
|
SensorManager* mSensorManager;
|
||||||
|
|
||||||
|
@ -229,23 +214,6 @@ namespace MWInput
|
||||||
|
|
||||||
void updateCursorMode();
|
void updateCursorMode();
|
||||||
|
|
||||||
bool checkAllowedToUseItems() const;
|
|
||||||
|
|
||||||
void toggleMainMenu();
|
|
||||||
void toggleSpell();
|
|
||||||
void toggleWeapon();
|
|
||||||
void toggleInventory();
|
|
||||||
void toggleConsole();
|
|
||||||
void screenshot();
|
|
||||||
void toggleJournal();
|
|
||||||
void activate();
|
|
||||||
void toggleWalking();
|
|
||||||
void toggleSneaking();
|
|
||||||
void toggleAutoMove();
|
|
||||||
void rest();
|
|
||||||
void quickLoad();
|
|
||||||
void quickSave();
|
|
||||||
|
|
||||||
void quickKey (int index);
|
void quickKey (int index);
|
||||||
void showQuickKeysMenu();
|
void showQuickKeysMenu();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue