mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-05 17:45:34 +00:00
The game mode is now properly restored once a dialog is finished. Previously the game mode was only set in the window manager but it has to go through the input manager firs to get correct input state. Also updated the gui script commands to also use the input manager and not the window manager.
At some point the gui mode code should be moved to a class that handles all game mode (engine?).
This commit is contained in:
parent
30e0d713ed
commit
1907aeb6c6
10 changed files with 120 additions and 75 deletions
|
@ -271,6 +271,7 @@ void OMW::Engine::go()
|
||||||
// Sets up the input system
|
// Sets up the input system
|
||||||
MWInput::MWInputManager input(mOgre, mEnvironment.mWorld->getPlayerPos(),
|
MWInput::MWInputManager input(mOgre, mEnvironment.mWorld->getPlayerPos(),
|
||||||
*mEnvironment.mWindowManager, mDebug, *this);
|
*mEnvironment.mWindowManager, mDebug, *this);
|
||||||
|
mEnvironment.mInputManager = &input;
|
||||||
|
|
||||||
focusFrameCounter = 0;
|
focusFrameCounter = 0;
|
||||||
|
|
||||||
|
|
43
apps/openmw/mwgui/mode.hpp
Normal file
43
apps/openmw/mwgui/mode.hpp
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
#ifndef MWGUI_MODE_H
|
||||||
|
#define MWGUI_MODE_H
|
||||||
|
|
||||||
|
namespace MWGui
|
||||||
|
{
|
||||||
|
enum GuiMode
|
||||||
|
{
|
||||||
|
GM_Game, // Game mode, only HUD
|
||||||
|
GM_Inventory, // Inventory mode
|
||||||
|
GM_MainMenu, // Main menu mode
|
||||||
|
|
||||||
|
GM_Console, // Console mode
|
||||||
|
|
||||||
|
// None of the following are implemented yet
|
||||||
|
|
||||||
|
GM_Dialogue, // NPC interaction
|
||||||
|
GM_Barter,
|
||||||
|
GM_Rest,
|
||||||
|
// .. more here ..
|
||||||
|
|
||||||
|
// Startup character creation dialogs
|
||||||
|
GM_Name,
|
||||||
|
GM_Race,
|
||||||
|
GM_Birth,
|
||||||
|
GM_Class,
|
||||||
|
GM_Review
|
||||||
|
};
|
||||||
|
|
||||||
|
// Windows shown in inventory mode
|
||||||
|
enum GuiWindow
|
||||||
|
{
|
||||||
|
GW_None = 0,
|
||||||
|
|
||||||
|
GW_Map = 0x01,
|
||||||
|
GW_Inventory = 0x02,
|
||||||
|
GW_Magic = 0x04,
|
||||||
|
GW_Stats = 0x08,
|
||||||
|
|
||||||
|
GW_ALL = 0xFF
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -4,6 +4,7 @@
|
||||||
#include "race.hpp"
|
#include "race.hpp"
|
||||||
|
|
||||||
#include "../mwmechanics/mechanicsmanager.hpp"
|
#include "../mwmechanics/mechanicsmanager.hpp"
|
||||||
|
#include "../mwinput/inputmanager.hpp"
|
||||||
|
|
||||||
#include "console.hpp"
|
#include "console.hpp"
|
||||||
|
|
||||||
|
@ -136,8 +137,10 @@ void WindowManager::updateVisible()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// All other modes are ignored
|
// Unsupported mode, switch back to game
|
||||||
mode = GM_Game;
|
// Note: The call will eventually end up this method again but
|
||||||
|
// will stop at the check if(mode == GM_Game) above.
|
||||||
|
environment.mInputManager->setGuiMode(GM_Game);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::setValue (const std::string& id, const MWMechanics::Stat<int>& value)
|
void WindowManager::setValue (const std::string& id, const MWMechanics::Stat<int>& value)
|
||||||
|
@ -197,11 +200,11 @@ void WindowManager::onNameDialogDone()
|
||||||
updateCharacterGeneration();
|
updateCharacterGeneration();
|
||||||
|
|
||||||
if (reviewNext)
|
if (reviewNext)
|
||||||
setMode(GM_Review);
|
environment.mInputManager->setGuiMode(GM_Review);
|
||||||
else if (goNext)
|
else if (goNext)
|
||||||
setMode(GM_Race);
|
environment.mInputManager->setGuiMode(GM_Race);
|
||||||
else
|
else
|
||||||
setMode(GM_Game);
|
environment.mInputManager->setGuiMode(GM_Game);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::onRaceDialogDone()
|
void WindowManager::onRaceDialogDone()
|
||||||
|
@ -219,11 +222,11 @@ void WindowManager::onRaceDialogDone()
|
||||||
updateCharacterGeneration();
|
updateCharacterGeneration();
|
||||||
|
|
||||||
if (reviewNext)
|
if (reviewNext)
|
||||||
setMode(GM_Review);
|
environment.mInputManager->setGuiMode(GM_Review);
|
||||||
else if (goNext)
|
else if (goNext)
|
||||||
setMode(GM_Class);
|
environment.mInputManager->setGuiMode(GM_Class);
|
||||||
else
|
else
|
||||||
setMode(GM_Game);
|
environment.mInputManager->setGuiMode(GM_Game);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::onRaceDialogBack()
|
void WindowManager::onRaceDialogBack()
|
||||||
|
@ -238,5 +241,5 @@ void WindowManager::onRaceDialogBack()
|
||||||
|
|
||||||
updateCharacterGeneration();
|
updateCharacterGeneration();
|
||||||
|
|
||||||
setMode(GM_Name);
|
environment.mInputManager->setGuiMode(GM_Name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "../mwmechanics/stat.hpp"
|
#include "../mwmechanics/stat.hpp"
|
||||||
|
#include "mode.hpp"
|
||||||
|
|
||||||
namespace MyGUI
|
namespace MyGUI
|
||||||
{
|
{
|
||||||
|
@ -42,42 +43,6 @@ namespace MWGui
|
||||||
class TextInputDialog;
|
class TextInputDialog;
|
||||||
class RaceDialog;
|
class RaceDialog;
|
||||||
|
|
||||||
enum GuiMode
|
|
||||||
{
|
|
||||||
GM_Game, // Game mode, only HUD
|
|
||||||
GM_Inventory, // Inventory mode
|
|
||||||
GM_MainMenu, // Main menu mode
|
|
||||||
|
|
||||||
GM_Console, // Console mode
|
|
||||||
|
|
||||||
// None of the following are implemented yet
|
|
||||||
|
|
||||||
GM_Dialogue, // NPC interaction
|
|
||||||
GM_Barter,
|
|
||||||
GM_Rest,
|
|
||||||
// .. more here ..
|
|
||||||
|
|
||||||
// Startup character creation dialogs
|
|
||||||
GM_Name,
|
|
||||||
GM_Race,
|
|
||||||
GM_Birth,
|
|
||||||
GM_Class,
|
|
||||||
GM_Review
|
|
||||||
};
|
|
||||||
|
|
||||||
// Windows shown in inventory mode
|
|
||||||
enum GuiWindow
|
|
||||||
{
|
|
||||||
GW_None = 0,
|
|
||||||
|
|
||||||
GW_Map = 0x01,
|
|
||||||
GW_Inventory = 0x02,
|
|
||||||
GW_Magic = 0x04,
|
|
||||||
GW_Stats = 0x08,
|
|
||||||
|
|
||||||
GW_ALL = 0xFF
|
|
||||||
};
|
|
||||||
|
|
||||||
class WindowManager
|
class WindowManager
|
||||||
{
|
{
|
||||||
MWWorld::Environment& environment;
|
MWWorld::Environment& environment;
|
||||||
|
|
|
@ -79,34 +79,6 @@ namespace MWInput
|
||||||
ogre.screenshot(buf);
|
ogre.screenshot(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Switch between gui modes. Besides controlling the Gui windows
|
|
||||||
// this also makes sure input is directed to the right place
|
|
||||||
void setGuiMode(MWGui::GuiMode mode)
|
|
||||||
{
|
|
||||||
// Tell the GUI what to show (this also takes care of the mouse
|
|
||||||
// pointer)
|
|
||||||
windows.setMode(mode);
|
|
||||||
|
|
||||||
// Are we in GUI mode now?
|
|
||||||
if(windows.isGuiMode())
|
|
||||||
{
|
|
||||||
// Disable mouse look
|
|
||||||
mouse->setCamera(NULL);
|
|
||||||
|
|
||||||
// Enable GUI events
|
|
||||||
guiEvents->enabled = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Start mouse-looking again. TODO: This should also allow
|
|
||||||
// for other ways to disable mouselook, like paralyzation.
|
|
||||||
mouse->setCamera(player.getCamera());
|
|
||||||
|
|
||||||
// Disable GUI events
|
|
||||||
guiEvents->enabled = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called when the user presses the button to toggle the inventory
|
// Called when the user presses the button to toggle the inventory
|
||||||
// screen.
|
// screen.
|
||||||
void toggleInventory()
|
void toggleInventory()
|
||||||
|
@ -275,6 +247,34 @@ namespace MWInput
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Switch between gui modes. Besides controlling the Gui windows
|
||||||
|
// this also makes sure input is directed to the right place
|
||||||
|
void setGuiMode(MWGui::GuiMode mode)
|
||||||
|
{
|
||||||
|
// Tell the GUI what to show (this also takes care of the mouse
|
||||||
|
// pointer)
|
||||||
|
windows.setMode(mode);
|
||||||
|
|
||||||
|
// Are we in GUI mode now?
|
||||||
|
if(windows.isGuiMode())
|
||||||
|
{
|
||||||
|
// Disable mouse look
|
||||||
|
mouse->setCamera(NULL);
|
||||||
|
|
||||||
|
// Enable GUI events
|
||||||
|
guiEvents->enabled = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Start mouse-looking again. TODO: This should also allow
|
||||||
|
// for other ways to disable mouselook, like paralyzation.
|
||||||
|
mouse->setCamera(player.getCamera());
|
||||||
|
|
||||||
|
// Disable GUI events
|
||||||
|
guiEvents->enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
MWInputManager::MWInputManager(OEngine::Render::OgreRenderer &ogre,
|
MWInputManager::MWInputManager(OEngine::Render::OgreRenderer &ogre,
|
||||||
|
@ -290,4 +290,9 @@ namespace MWInput
|
||||||
{
|
{
|
||||||
delete impl;
|
delete impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MWInputManager::setGuiMode(MWGui::GuiMode mode)
|
||||||
|
{
|
||||||
|
impl->setGuiMode(mode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef _MWINPUT_MWINPUTMANAGER_H
|
#ifndef _MWINPUT_MWINPUTMANAGER_H
|
||||||
#define _MWINPUT_MWINPUTMANAGER_H
|
#define _MWINPUT_MWINPUTMANAGER_H
|
||||||
|
|
||||||
|
#include "../mwgui/mode.hpp"
|
||||||
|
|
||||||
namespace OEngine
|
namespace OEngine
|
||||||
{
|
{
|
||||||
namespace Render
|
namespace Render
|
||||||
|
@ -45,6 +47,8 @@ namespace MWInput
|
||||||
bool debug,
|
bool debug,
|
||||||
OMW::Engine& engine);
|
OMW::Engine& engine);
|
||||||
~MWInputManager();
|
~MWInputManager();
|
||||||
|
|
||||||
|
void setGuiMode(MWGui::GuiMode mode);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <components/interpreter/opcodes.hpp>
|
#include <components/interpreter/opcodes.hpp>
|
||||||
|
|
||||||
#include "../mwgui/window_manager.hpp"
|
#include "../mwgui/window_manager.hpp"
|
||||||
|
#include "../mwinput/inputmanager.hpp"
|
||||||
|
|
||||||
#include "interpretercontext.hpp"
|
#include "interpretercontext.hpp"
|
||||||
|
|
||||||
|
@ -47,7 +48,7 @@ namespace MWScript
|
||||||
InterpreterContext& context =
|
InterpreterContext& context =
|
||||||
static_cast<InterpreterContext&> (runtime.getContext());
|
static_cast<InterpreterContext&> (runtime.getContext());
|
||||||
|
|
||||||
context.getWindowManager().setMode(mDialogue);
|
context.getInputManager().setGuiMode(mDialogue);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
#include "../mwgui/window_manager.hpp"
|
#include "../mwgui/window_manager.hpp"
|
||||||
|
|
||||||
|
#include "../mwinput/inputmanager.hpp"
|
||||||
|
|
||||||
#include "locals.hpp"
|
#include "locals.hpp"
|
||||||
#include "globalscripts.hpp"
|
#include "globalscripts.hpp"
|
||||||
|
|
||||||
|
@ -263,6 +265,11 @@ namespace MWScript
|
||||||
return *mEnvironment.mWindowManager;
|
return *mEnvironment.mWindowManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MWInput::MWInputManager& InterpreterContext::getInputManager()
|
||||||
|
{
|
||||||
|
return *mEnvironment.mInputManager;
|
||||||
|
}
|
||||||
|
|
||||||
MWWorld::World& InterpreterContext::getWorld()
|
MWWorld::World& InterpreterContext::getWorld()
|
||||||
{
|
{
|
||||||
return *mEnvironment.mWorld;
|
return *mEnvironment.mWorld;
|
||||||
|
|
|
@ -15,6 +15,11 @@ namespace MWSound
|
||||||
class SoundManager;
|
class SoundManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace MWInput
|
||||||
|
{
|
||||||
|
struct MWInputManager;
|
||||||
|
}
|
||||||
|
|
||||||
namespace MWScript
|
namespace MWScript
|
||||||
{
|
{
|
||||||
struct Locals;
|
struct Locals;
|
||||||
|
@ -107,6 +112,8 @@ namespace MWScript
|
||||||
|
|
||||||
MWGui::WindowManager& getWindowManager();
|
MWGui::WindowManager& getWindowManager();
|
||||||
|
|
||||||
|
MWInput::MWInputManager& getInputManager();
|
||||||
|
|
||||||
MWWorld::Ptr getReference();
|
MWWorld::Ptr getReference();
|
||||||
///< Reference, that the script is running from (can be empty)
|
///< Reference, that the script is running from (can be empty)
|
||||||
};
|
};
|
||||||
|
|
|
@ -26,6 +26,11 @@ namespace MWDialogue
|
||||||
class DialogueManager;
|
class DialogueManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace MWInput
|
||||||
|
{
|
||||||
|
struct MWInputManager;
|
||||||
|
}
|
||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
class World;
|
class World;
|
||||||
|
@ -36,7 +41,8 @@ namespace MWWorld
|
||||||
public:
|
public:
|
||||||
Environment()
|
Environment()
|
||||||
: mWorld (0), mSoundManager (0), mGlobalScripts (0), mWindowManager (0),
|
: mWorld (0), mSoundManager (0), mGlobalScripts (0), mWindowManager (0),
|
||||||
mMechanicsManager (0), mDialogueManager (0), mFrameDuration (0)
|
mMechanicsManager (0), mDialogueManager (0), mFrameDuration (0),
|
||||||
|
mInputManager (0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
World *mWorld;
|
World *mWorld;
|
||||||
|
@ -46,6 +52,9 @@ namespace MWWorld
|
||||||
MWMechanics::MechanicsManager *mMechanicsManager;
|
MWMechanics::MechanicsManager *mMechanicsManager;
|
||||||
MWDialogue::DialogueManager *mDialogueManager;
|
MWDialogue::DialogueManager *mDialogueManager;
|
||||||
float mFrameDuration;
|
float mFrameDuration;
|
||||||
|
|
||||||
|
// For setting GUI mode
|
||||||
|
MWInput::MWInputManager *mInputManager;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue