diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index e3a3488315..46cee2e8bf 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -270,6 +270,7 @@ void OMW::Engine::go() // Sets up the input system MWInput::MWInputManager input(mOgre, mEnvironment.mWorld->getPlayerPos(), *mEnvironment.mWindowManager, mDebug, *this); + mEnvironment.mInputManager = &input; focusFrameCounter = 0; diff --git a/apps/openmw/mwgui/layouts.hpp b/apps/openmw/mwgui/layouts.hpp index 45b207f94d..a370f9f13f 100644 --- a/apps/openmw/mwgui/layouts.hpp +++ b/apps/openmw/mwgui/layouts.hpp @@ -285,6 +285,7 @@ namespace MWGui } }; +#if 0 class InventoryWindow : public OEngine::GUI::Layout { public: @@ -403,5 +404,6 @@ namespace MWGui MyGUI::Colour activeColor; MyGUI::Colour inactiveColor; }; +#endif } #endif diff --git a/apps/openmw/mwgui/mode.hpp b/apps/openmw/mwgui/mode.hpp new file mode 100644 index 0000000000..b18dd9f959 --- /dev/null +++ b/apps/openmw/mwgui/mode.hpp @@ -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 diff --git a/apps/openmw/mwgui/race.cpp b/apps/openmw/mwgui/race.cpp index a9549bc244..00952782c9 100644 --- a/apps/openmw/mwgui/race.cpp +++ b/apps/openmw/mwgui/race.cpp @@ -1,6 +1,7 @@ #include "race.hpp" #include "../mwworld/environment.hpp" #include "../mwworld/world.hpp" +#include "window_manager.hpp" #include "components/esm_store/store.hpp" #include @@ -12,7 +13,7 @@ using namespace MWGui; -RaceDialog::RaceDialog(MWWorld::Environment& environment, bool showNext) +RaceDialog::RaceDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize) : Layout("openmw_chargen_race_layout.xml") , environment(environment) , genderIndex(0) @@ -21,12 +22,17 @@ RaceDialog::RaceDialog(MWWorld::Environment& environment, bool showNext) , faceCount(10) , hairCount(14) { - mMainWidget->setCoord(mMainWidget->getCoord() + MyGUI::IntPoint(0, 100)); + // Centre dialog + MyGUI::IntCoord coord = mMainWidget->getCoord(); + coord.left = (gameWindowSize.width - coord.width)/2; + coord.top = (gameWindowSize.height - coord.height)/2; + mMainWidget->setCoord(coord); // These are just demo values, you should replace these with // real calls from outside the class later. - setText("AppearanceT", "Appearance"); + WindowManager *wm = environment.mWindowManager; + setText("AppearanceT", wm->getGameSettingString("sRaceMenu1", "Appearance")); getWidget(appearanceBox, "AppearanceBox"); getWidget(headRotate, "HeadRotate"); @@ -38,29 +44,34 @@ RaceDialog::RaceDialog(MWWorld::Environment& environment, bool showNext) // Set up next/previous buttons MyGUI::ButtonPtr prevButton, nextButton; + setText("GenderChoiceT", wm->getGameSettingString("sRaceMenu2", "Change Sex")); getWidget(prevButton, "PrevGenderButton"); getWidget(nextButton, "NextGenderButton"); prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousGender); nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextGender); + setText("FaceChoiceT", wm->getGameSettingString("sRaceMenu3", "Change Face")); getWidget(prevButton, "PrevFaceButton"); getWidget(nextButton, "NextFaceButton"); prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousFace); nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextFace); + setText("HairChoiceT", wm->getGameSettingString("sRaceMenu3", "Change Hair")); getWidget(prevButton, "PrevHairButton"); getWidget(nextButton, "NextHairButton"); prevButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousHair); nextButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onSelectNextHair); - setText("RaceT", "Race"); + setText("RaceT", wm->getGameSettingString("sRaceMenu4", "Race")); getWidget(raceList, "RaceList"); raceList->setScrollVisible(true); raceList->eventListSelectAccept = MyGUI::newDelegate(this, &RaceDialog::onSelectRace); raceList->eventListMouseItemActivate = MyGUI::newDelegate(this, &RaceDialog::onSelectRace); raceList->eventListChangePosition = MyGUI::newDelegate(this, &RaceDialog::onSelectRace); + setText("SkillsT", wm->getGameSettingString("sBonusSkillTitle", "Skill Bonus")); getWidget(skillList, "SkillList"); + setText("SpellPowerT", wm->getGameSettingString("sRaceMenu7", "Specials")); getWidget(spellPowerList, "SpellPowerList"); // TODO: These buttons should be managed by a Dialog class @@ -71,28 +82,54 @@ RaceDialog::RaceDialog(MWWorld::Environment& environment, bool showNext) MyGUI::ButtonPtr okButton; getWidget(okButton, "OKButton"); okButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onOkClicked); - if (showNext) - { - okButton->setCaption("Next"); - - // Adjust back button when next is shown - backButton->setCoord(backButton->getCoord() - MyGUI::IntPoint(18, 0)); - okButton->setCoord(okButton->getCoord() + MyGUI::IntCoord(-18, 0, 18, 0)); - } updateRaces(); updateSkills(); updateSpellPowers(); } -void RaceDialog::setRace(const std::string &race) +void RaceDialog::setNextButtonShow(bool shown) { - currentRace = race; + MyGUI::ButtonPtr backButton; + getWidget(backButton, "BackButton"); + + MyGUI::ButtonPtr okButton; + getWidget(okButton, "OKButton"); + + // TODO: All hardcoded coords for buttons are temporary, will be replaced with a dynamic system. + if (shown) + { + okButton->setCaption("Next"); + + // Adjust back button when next is shown + backButton->setCoord(MyGUI::IntCoord(471 - 18, 397, 53, 23)); + okButton->setCoord(MyGUI::IntCoord(532 - 18, 397, 42 + 18, 23)); + } + else + { + okButton->setCaption("OK"); + backButton->setCoord(MyGUI::IntCoord(471, 397, 53, 23)); + okButton->setCoord(MyGUI::IntCoord(532, 397, 42, 23)); + } +} + +void RaceDialog::open() +{ + updateRaces(); + updateSkills(); + updateSpellPowers(); + setVisible(true); +} + + +void RaceDialog::setRaceId(const std::string &raceId) +{ + currentRaceId = raceId; raceList->setIndexSelected(MyGUI::ITEM_NONE); size_t count = raceList->getItemCount(); for (size_t i = 0; i < count; ++i) { - if (boost::iequals(raceList->getItem(i), race)) + if (boost::iequals(raceList->getItem(i), raceId)) { raceList->setIndexSelected(i); break; @@ -165,11 +202,11 @@ void RaceDialog::onSelectRace(MyGUI::List* _sender, size_t _index) if (_index == MyGUI::ITEM_NONE) return; - const std::string race = raceList->getItem(_index); - if (boost::iequals(currentRace, race)) + const std::string *raceId = raceList->getItemDataAt(_index); + if (boost::iequals(currentRaceId, *raceId)) return; - currentRace = race; + currentRaceId = *raceId; updateSkills(); updateSpellPowers(); } @@ -192,8 +229,8 @@ void RaceDialog::updateRaces() if (!playable) // Only display playable races continue; - raceList->addItem(race.name); - if (boost::iequals(race.name, currentRace)) + raceList->addItem(race.name, it->first); + if (boost::iequals(race.name, currentRaceId)) raceList->setIndexSelected(index); ++index; } @@ -207,7 +244,7 @@ void RaceDialog::updateSkills() } skillItems.clear(); - if (currentRace.empty()) + if (currentRaceId.empty()) return; MyGUI::StaticTextPtr skillNameWidget, skillBonusWidget; @@ -215,8 +252,9 @@ void RaceDialog::updateSkills() MyGUI::IntCoord coord1(0, 0, skillList->getWidth() - (40 + 4), 18); MyGUI::IntCoord coord2(coord1.left + coord1.width, 0, 40, 18); + WindowManager *wm = environment.mWindowManager; ESMS::ESMStore &store = environment.mWorld->getStore(); - const ESM::Race *race = store.races.find(currentRace); + const ESM::Race *race = store.races.find(currentRaceId); int count = sizeof(race->data.bonus)/sizeof(race->data.bonus[0]); // TODO: Find a portable macro for this ARRAYSIZE? for (int i = 0; i < count; ++i) { @@ -227,7 +265,8 @@ void RaceDialog::updateSkills() skillNameWidget = skillList->createWidget("SandText", coord1, MyGUI::Align::Default, std::string("SkillName") + boost::lexical_cast(i)); assert(skillId >= 0 && skillId < ESM::Skill::Length); - skillNameWidget->setCaption(ESMS::Skill::sSkillNames[skillId]); + const std::string &skillNameId = ESMS::Skill::sSkillNameIds[skillId]; + skillNameWidget->setCaption(wm->getGameSettingString(skillNameId, skillNameId)); skillBonusWidget = skillList->createWidget("SandTextRight", coord2, MyGUI::Align::Default, std::string("SkillBonus") + boost::lexical_cast(i)); @@ -250,7 +289,7 @@ void RaceDialog::updateSpellPowers() } spellPowerItems.clear(); - if (currentRace.empty()) + if (currentRaceId.empty()) return; MyGUI::StaticTextPtr spellPowerWidget; @@ -258,7 +297,7 @@ void RaceDialog::updateSpellPowers() MyGUI::IntCoord coord(0, 0, spellPowerList->getWidth(), 18); ESMS::ESMStore &store = environment.mWorld->getStore(); - const ESM::Race *race = store.races.find(currentRace); + const ESM::Race *race = store.races.find(currentRaceId); std::vector::const_iterator it = race->powers.list.begin(); std::vector::const_iterator end = race->powers.list.end(); diff --git a/apps/openmw/mwgui/race.hpp b/apps/openmw/mwgui/race.hpp index 749bf55b29..fc147c6c7c 100644 --- a/apps/openmw/mwgui/race.hpp +++ b/apps/openmw/mwgui/race.hpp @@ -21,12 +21,10 @@ namespace MWGui { using namespace MyGUI; - typedef delegates::CDelegate0 EventHandle_Void; - class RaceDialog : public OEngine::GUI::Layout { public: - RaceDialog(MWWorld::Environment& environment, bool showNext); + RaceDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize); enum Gender { @@ -34,17 +32,21 @@ namespace MWGui GM_Female }; - const std::string &getRace() const { return currentRace; } + const std::string &getRaceId() const { return currentRaceId; } Gender getGender() const { return genderIndex == 0 ? GM_Male : GM_Female; } // getFace() // getHair() - void setRace(const std::string &race); + void setRaceId(const std::string &raceId); void setGender(Gender gender) { genderIndex = gender == GM_Male ? 0 : 1; } // setFace() // setHair() + void setNextButtonShow(bool shown); + void open(); + // Events + typedef delegates::CDelegate0 EventHandle_Void; /** Event : Back button clicked.\n signature : void method()\n @@ -93,7 +95,7 @@ namespace MWGui int genderIndex, faceIndex, hairIndex; int faceCount, hairCount; - std::string currentRace; + std::string currentRaceId; }; } #endif diff --git a/apps/openmw/mwgui/text_input.cpp b/apps/openmw/mwgui/text_input.cpp index 463f0baf82..36fa68eba1 100644 --- a/apps/openmw/mwgui/text_input.cpp +++ b/apps/openmw/mwgui/text_input.cpp @@ -4,32 +4,55 @@ using namespace MWGui; -TextInputDialog::TextInputDialog(MWWorld::Environment& environment, const std::string &label, bool showNext, MyGUI::IntSize size) +TextInputDialog::TextInputDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize) : Layout("openmw_text_input_layout.xml") , environment(environment) { // Centre dialog MyGUI::IntCoord coord = mMainWidget->getCoord(); - coord.left = (size.width - coord.width)/2; - coord.top = (size.height - coord.height)/2; + coord.left = (gameWindowSize.width - coord.width)/2; + coord.top = (gameWindowSize.height - coord.height)/2; mMainWidget->setCoord(coord); - setText("LabelT", label); - getWidget(textEdit, "TextEdit"); -// textEdit->eventEditSelectAccept = newDelegate(this, &TextInputDialog::onTextAccepted); + textEdit->eventEditSelectAccept = newDelegate(this, &TextInputDialog::onTextAccepted); // TODO: These buttons should be managed by a Dialog class MyGUI::ButtonPtr okButton; getWidget(okButton, "OKButton"); okButton->eventMouseButtonClick = MyGUI::newDelegate(this, &TextInputDialog::onOkClicked); - if (showNext) + + // Make sure the edit box has focus + MyGUI::InputManager::getInstance().setKeyFocusWidget(textEdit); +} + +void TextInputDialog::setNextButtonShow(bool shown) +{ + MyGUI::ButtonPtr okButton; + getWidget(okButton, "OKButton"); + if (shown) { okButton->setCaption("Next"); - - // Adjust back button when next is shown - okButton->setCoord(okButton->getCoord() + MyGUI::IntCoord(-18, 0, 18, 0)); + okButton->setCoord(MyGUI::IntCoord(264 - 18, 60, 42 + 18, 23)); } + else + { + okButton->setCaption("OK"); + okButton->setCoord(MyGUI::IntCoord(264, 60, 42, 23)); + } +} + +void TextInputDialog::setTextLabel(const std::string &label) +{ + setText("LabelT", label); +} + +void TextInputDialog::open() +{ + // Make sure the edit box has focus + MyGUI::InputManager::getInstance().setKeyFocusWidget(textEdit); + textEdit->setOnlyText(""); + setVisible(true); } // widget controls diff --git a/apps/openmw/mwgui/text_input.hpp b/apps/openmw/mwgui/text_input.hpp index 5f9d7745c4..8a0f1c56e4 100644 --- a/apps/openmw/mwgui/text_input.hpp +++ b/apps/openmw/mwgui/text_input.hpp @@ -15,17 +15,20 @@ namespace MWGui { using namespace MyGUI; - typedef delegates::CDelegate0 EventHandle_Void; - class TextInputDialog : public OEngine::GUI::Layout { public: - TextInputDialog(MWWorld::Environment& environment, const std::string &label, bool showNext, MyGUI::IntSize size); + TextInputDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize); std::string getTextInput() const { return textEdit ? textEdit->getOnlyText() : ""; } void setTextInput(const std::string &text) { if (textEdit) textEdit->setOnlyText(text); } + void setNextButtonShow(bool shown); + void setTextLabel(const std::string &label); + void open(); + // Events + typedef delegates::CDelegate0 EventHandle_Void; /** Event : Dialog finished, OK button clicked.\n signature : void method()\n diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index c01a70bb4c..5997a433b4 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -4,6 +4,7 @@ #include "race.hpp" #include "../mwmechanics/mechanicsmanager.hpp" +#include "../mwinput/inputmanager.hpp" #include "console.hpp" @@ -37,7 +38,9 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment menu = new MainMenu(w,h); map = new MapWindow(); stats = new StatsWindow (environment.mWorld->getStore()); +#if 0 inventory = new InventoryWindow (); +#endif console = new Console(w,h, environment, extensions); // The HUD is always on @@ -54,7 +57,9 @@ WindowManager::~WindowManager() delete map; delete menu; delete stats; +#if 0 delete inventory; +#endif delete nameDialog; delete raceDialog; @@ -66,7 +71,9 @@ void WindowManager::updateVisible() map->setVisible(false); menu->setVisible(false); stats->setVisible(false); +#if 0 inventory->setVisible(false); +#endif console->disable(); // Mouse is visible whenever we're not in game mode @@ -94,19 +101,24 @@ void WindowManager::updateVisible() if (mode == GM_Name) { if (!nameDialog) - nameDialog = new TextInputDialog(environment, "Name", nameChosen, gui->getViewSize()); + nameDialog = new TextInputDialog(environment, gui->getViewSize()); + + std::string sName = getGameSettingString("sName", "Name"); + nameDialog->setTextLabel(sName); + nameDialog->setNextButtonShow(nameChosen); nameDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onNameDialogDone); - nameDialog->setVisible(true); + nameDialog->open(); return; } if (mode == GM_Race) { if (!raceDialog) - raceDialog = new RaceDialog (environment, raceChosen); + raceDialog = new RaceDialog(environment, gui->getViewSize()); + raceDialog->setNextButtonShow(raceChosen); raceDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onRaceDialogDone); raceDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onRaceDialogBack); - raceDialog->setVisible(true); + raceDialog->open(); return; } @@ -119,14 +131,18 @@ void WindowManager::updateVisible() int eff = shown & allowed; // Show the windows we want - map -> setVisible( eff & GW_Map ); - stats -> setVisible( eff & GW_Stats ); + map -> setVisible( (eff & GW_Map) != 0 ); + stats -> setVisible( (eff & GW_Stats) != 0 ); +#if 0 // inventory -> setVisible( eff & GW_Inventory ); +#endif return; } - // All other modes are ignored - mode = GM_Game; + // Unsupported mode, switch back to 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& value) @@ -162,6 +178,14 @@ void WindowManager::messageBox (const std::string& message, const std::vectorgetStore().gameSettings.search(id); + if (setting && setting->type == ESM::VT_String) + return setting->str; + return default; +} + void WindowManager::updateCharacterGeneration() { if (raceDialog) @@ -175,40 +199,46 @@ void WindowManager::updateCharacterGeneration() void WindowManager::onNameDialogDone() { + nameDialog->eventDone = MWGui::TextInputDialog::EventHandle_Void(); + + bool goNext = nameChosen; // Go to next dialog if name was previously chosen nameChosen = true; if (nameDialog) { nameDialog->setVisible(false); environment.mMechanicsManager->setPlayerName(nameDialog->getTextInput()); } - delete nameDialog; - nameDialog = nullptr; updateCharacterGeneration(); if (reviewNext) - setMode(GM_Review); - else if (raceChosen) - setMode(GM_Race); + environment.mInputManager->setGuiMode(GM_Review); + else if (goNext) + environment.mInputManager->setGuiMode(GM_Race); + else + environment.mInputManager->setGuiMode(GM_Game); } void WindowManager::onRaceDialogDone() { + raceDialog->eventDone = MWGui::RaceDialog::EventHandle_Void(); + + bool goNext = raceChosen; // Go to next dialog if race was previously chosen raceChosen = true; if (raceDialog) { raceDialog->setVisible(false); - environment.mMechanicsManager->setPlayerRace(raceDialog->getRace(), raceDialog->getGender() == RaceDialog::GM_Male); + environment.mMechanicsManager->setPlayerRace(raceDialog->getRaceId(), raceDialog->getGender() == RaceDialog::GM_Male); } - delete raceDialog; - raceDialog = nullptr; updateCharacterGeneration(); if (reviewNext) - setMode(GM_Review); - else if (classChosen) - setMode(GM_Class); + environment.mInputManager->setGuiMode(GM_Review); + else if (goNext) + environment.mInputManager->setGuiMode(GM_Class); + else + environment.mInputManager->setGuiMode(GM_Game); } void WindowManager::onRaceDialogBack() @@ -216,12 +246,10 @@ void WindowManager::onRaceDialogBack() if (raceDialog) { raceDialog->setVisible(false); - environment.mMechanicsManager->setPlayerRace(raceDialog->getRace(), raceDialog->getGender() == RaceDialog::GM_Male); + environment.mMechanicsManager->setPlayerRace(raceDialog->getRaceId(), raceDialog->getGender() == RaceDialog::GM_Male); } - delete raceDialog; - raceDialog = nullptr; updateCharacterGeneration(); - setMode(GM_Name); + environment.mInputManager->setGuiMode(GM_Name); } diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index 04fe5c7c99..4088a9b631 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -14,6 +14,7 @@ #include #include "../mwmechanics/stat.hpp" +#include "mode.hpp" namespace MyGUI { @@ -42,42 +43,6 @@ namespace MWGui class TextInputDialog; 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 { MWWorld::Environment& environment; @@ -85,7 +50,9 @@ namespace MWGui MapWindow *map; MainMenu *menu; StatsWindow *stats; +#if 0 InventoryWindow *inventory; +#endif Console *console; // Character creation @@ -172,6 +139,15 @@ namespace MWGui void messageBox (const std::string& message, const std::vector& buttons); + /** + * Fetches a GMST string from the store, if there is no setting with the given + * ID or it is not a string the default string is returned. + * + * @param id Identifier for the GMST setting, e.g. "aName" + * @param default Default value if the GMST setting cannot be used. + */ + const std::string &getGameSettingString(const std::string &id, const std::string &default); + private: void updateCharacterGeneration(); void checkCharacterGeneration(GuiMode mode); diff --git a/apps/openmw/mwinput/inputmanager.cpp b/apps/openmw/mwinput/inputmanager.cpp index f730150b0b..8dba12b7a6 100644 --- a/apps/openmw/mwinput/inputmanager.cpp +++ b/apps/openmw/mwinput/inputmanager.cpp @@ -79,34 +79,6 @@ namespace MWInput 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 // screen. void toggleInventory() @@ -275,6 +247,34 @@ namespace MWInput 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, @@ -290,4 +290,9 @@ namespace MWInput { delete impl; } + + void MWInputManager::setGuiMode(MWGui::GuiMode mode) + { + impl->setGuiMode(mode); + } } diff --git a/apps/openmw/mwinput/inputmanager.hpp b/apps/openmw/mwinput/inputmanager.hpp index 554089588d..0e0c4650f0 100644 --- a/apps/openmw/mwinput/inputmanager.hpp +++ b/apps/openmw/mwinput/inputmanager.hpp @@ -1,6 +1,8 @@ #ifndef _MWINPUT_MWINPUTMANAGER_H #define _MWINPUT_MWINPUTMANAGER_H +#include "../mwgui/mode.hpp" + namespace OEngine { namespace Render @@ -45,6 +47,8 @@ namespace MWInput bool debug, OMW::Engine& engine); ~MWInputManager(); + + void setGuiMode(MWGui::GuiMode mode); }; } #endif diff --git a/apps/openmw/mwscript/guiextensions.cpp b/apps/openmw/mwscript/guiextensions.cpp index 4d389748d8..0339a11f50 100644 --- a/apps/openmw/mwscript/guiextensions.cpp +++ b/apps/openmw/mwscript/guiextensions.cpp @@ -8,6 +8,7 @@ #include #include "../mwgui/window_manager.hpp" +#include "../mwinput/inputmanager.hpp" #include "interpretercontext.hpp" @@ -47,7 +48,7 @@ namespace MWScript InterpreterContext& context = static_cast (runtime.getContext()); - context.getWindowManager().setMode(mDialogue); + context.getInputManager().setGuiMode(mDialogue); } }; diff --git a/apps/openmw/mwscript/interpretercontext.cpp b/apps/openmw/mwscript/interpretercontext.cpp index 22a5aaa702..f2f1e6e104 100644 --- a/apps/openmw/mwscript/interpretercontext.cpp +++ b/apps/openmw/mwscript/interpretercontext.cpp @@ -11,6 +11,8 @@ #include "../mwgui/window_manager.hpp" +#include "../mwinput/inputmanager.hpp" + #include "locals.hpp" #include "globalscripts.hpp" @@ -263,6 +265,11 @@ namespace MWScript return *mEnvironment.mWindowManager; } + MWInput::MWInputManager& InterpreterContext::getInputManager() + { + return *mEnvironment.mInputManager; + } + MWWorld::World& InterpreterContext::getWorld() { return *mEnvironment.mWorld; diff --git a/apps/openmw/mwscript/interpretercontext.hpp b/apps/openmw/mwscript/interpretercontext.hpp index ec3c9eb878..031820d5dd 100644 --- a/apps/openmw/mwscript/interpretercontext.hpp +++ b/apps/openmw/mwscript/interpretercontext.hpp @@ -15,6 +15,11 @@ namespace MWSound class SoundManager; } +namespace MWInput +{ + struct MWInputManager; +} + namespace MWScript { struct Locals; @@ -107,6 +112,8 @@ namespace MWScript MWGui::WindowManager& getWindowManager(); + MWInput::MWInputManager& getInputManager(); + MWWorld::Ptr getReference(); ///< Reference, that the script is running from (can be empty) }; diff --git a/apps/openmw/mwworld/environment.hpp b/apps/openmw/mwworld/environment.hpp index f9e2e8a42b..c04dfcbf10 100644 --- a/apps/openmw/mwworld/environment.hpp +++ b/apps/openmw/mwworld/environment.hpp @@ -26,6 +26,11 @@ namespace MWDialogue class DialogueManager; } +namespace MWInput +{ + struct MWInputManager; +} + namespace MWWorld { class World; @@ -36,7 +41,8 @@ namespace MWWorld public: Environment() : mWorld (0), mSoundManager (0), mGlobalScripts (0), mWindowManager (0), - mMechanicsManager (0), mDialogueManager (0), mFrameDuration (0) + mMechanicsManager (0), mDialogueManager (0), mFrameDuration (0), + mInputManager (0) {} World *mWorld; @@ -46,6 +52,9 @@ namespace MWWorld MWMechanics::MechanicsManager *mMechanicsManager; MWDialogue::DialogueManager *mDialogueManager; float mFrameDuration; + + // For setting GUI mode + MWInput::MWInputManager *mInputManager; }; } diff --git a/components/esm/loadskil.hpp b/components/esm/loadskil.hpp index fbe11f1db9..27959c4efa 100644 --- a/components/esm/loadskil.hpp +++ b/components/esm/loadskil.hpp @@ -61,7 +61,7 @@ struct Skill HandToHand = 26, Length }; - static const std::string sSkillNames[Length]; + static const std::string sSkillNameIds[Length]; void load(ESMReader &esm) { diff --git a/components/esm/skill.cpp b/components/esm/skill.cpp index cc56a40594..021248ab9c 100644 --- a/components/esm/skill.cpp +++ b/components/esm/skill.cpp @@ -2,33 +2,33 @@ namespace ESM { - const std::string Skill::sSkillNames[Length] = { - "Block", - "Armorer", - "Medium Armor", - "Heavy Armor", - "Blunt Weapon", - "Long Blade", - "Axe", - "Spear", - "Athletics", - "Enchant", - "Destruction", - "Alteration", - "Illusion", - "Conjuration", - "Mysticism", - "Restoration", - "Alchemy", - "Unarmored", - "Security", - "Sneak", - "Acrobatics", - "Light Armor", - "Short Blade", - "Marksman", - "Mercantile", - "Speechcraft", - "Hand To Hand", + const std::string Skill::sSkillNameIds[Length] = { + "sSkillBlock", + "sSkillArmorer", + "sSkillMediumarmor", + "sSkillHeavyarmor", + "sSkillBluntweapon", + "sSkillLongblade", + "sSkillAxe", + "sSkillSpear", + "sSkillAthletics", + "sSkillEnchant", + "sSkillDestruction", + "sSkillAlteration", + "sSkillIllusion", + "sSkillConjuration", + "sSkillMysticism", + "sSkillRestoration", + "sSkillAlchemy", + "sSkillUnarmored", + "sSkillSecurity", + "sSkillSneak", + "sSkillAcrobatics", + "sSkillLightarmor", + "sSkillShortblade", + "sSkillMarksman", + "sSkillMercantile", + "sSkillSpeechcraft", + "sSkillHandtohand", }; }