From de554dffd267a9769104cd3d468b6eec047fd20a Mon Sep 17 00:00:00 2001 From: Jan Borsodi Date: Tue, 14 Sep 2010 21:27:40 +0200 Subject: [PATCH] Race dialog is now triggered by setMode(GM_Race) and not part of the inventory mode anymore. Initial implementation of the dialog management of back/ok/next buttons. --- apps/openmw/mwgui/mw_chargen.cpp | 17 +++++-- apps/openmw/mwgui/mw_chargen.hpp | 18 +++++++- apps/openmw/mwgui/window_manager.cpp | 68 ++++++++++++++++++++++++---- apps/openmw/mwgui/window_manager.hpp | 13 ++++++ 4 files changed, 101 insertions(+), 15 deletions(-) diff --git a/apps/openmw/mwgui/mw_chargen.cpp b/apps/openmw/mwgui/mw_chargen.cpp index f3ac0d5dd..37d979a65 100644 --- a/apps/openmw/mwgui/mw_chargen.cpp +++ b/apps/openmw/mwgui/mw_chargen.cpp @@ -12,7 +12,7 @@ using namespace MWGui; -RaceDialog::RaceDialog(MWWorld::Environment& environment) +RaceDialog::RaceDialog(MWWorld::Environment& environment, bool showNext) : Layout("openmw_chargen_race_layout.xml") , environment(environment) , genderIndex(0) @@ -63,14 +63,21 @@ RaceDialog::RaceDialog(MWWorld::Environment& environment) getWidget(skillList, "SkillList"); getWidget(spellPowerList, "SpellPowerList"); - MyGUI::ButtonPtr okButton; - getWidget(okButton, "OKButton"); - okButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onOkClicked); - + // TODO: These buttons should be managed by a Dialog class MyGUI::ButtonPtr backButton; getWidget(backButton, "BackButton"); backButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onBackClicked); + if (showNext) + { + } + else + { + MyGUI::ButtonPtr okButton; + getWidget(okButton, "OKButton"); + okButton->eventMouseButtonClick = MyGUI::newDelegate(this, &RaceDialog::onOkClicked); + } + updateRaces(); updateSkills(); updateSpellPowers(); diff --git a/apps/openmw/mwgui/mw_chargen.hpp b/apps/openmw/mwgui/mw_chargen.hpp index f11c692a0..9a0012ee4 100644 --- a/apps/openmw/mwgui/mw_chargen.hpp +++ b/apps/openmw/mwgui/mw_chargen.hpp @@ -34,9 +34,23 @@ namespace MWGui class RaceDialog : public OEngine::GUI::Layout { public: - RaceDialog(MWWorld::Environment& environment); + RaceDialog(MWWorld::Environment& environment, bool showNext); + + enum Gender + { + GM_Male, + GM_Female + }; + + const std::string &getRace() const { return currentRace; } + Gender getGender() const { return genderIndex == 0 ? GM_Male : GM_Female; } + // getFace() + // getHair() void setRace(const std::string &race); + void setGender(Gender gender) { genderIndex = gender == GM_Male ? 0 : 1; } + // setFace() + // setHair() // Events @@ -84,7 +98,7 @@ namespace MWGui MyGUI::WidgetPtr spellPowerList; std::vector spellPowerItems; - int genderIndex, faceIndex, hairIndex; + int genderIndex, faceIndex, hairIndex; int faceCount, hairCount; std::string currentRace; diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index d6706d21a..4f71ccace 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -2,6 +2,8 @@ #include "mw_layouts.hpp" #include "mw_chargen.hpp" +#include "../mwmechanics/mechanicsmanager.hpp" + #include "console.hpp" #include @@ -12,7 +14,17 @@ using namespace MWGui; WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment, const Compiler::Extensions& extensions, bool newGame) - : gui(_gui), mode(GM_Game), shown(GW_ALL), allowed(newGame ? GW_None : GW_ALL) + : environment(environment) + , raceDialog(nullptr) + , nameChosen(false) + , raceChosen(false) + , classChosen(false) + , birthChosen(false) + , reviewNext(false) + , gui(_gui) + , mode(GM_Game) + , shown(GW_ALL) + , allowed(newGame ? GW_None : GW_ALL) { // Get size info from the Gui object assert(gui); @@ -26,10 +38,6 @@ WindowManager::WindowManager(MyGUI::Gui *_gui, MWWorld::Environment& environment inventory = new InventoryWindow (); console = new Console(w,h, environment, extensions); - raceDialog = new RaceDialog (environment); - raceDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onRaceDialogDone); - raceDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onRaceDialogBack); - // The HUD is always on hud->setVisible(true); @@ -57,7 +65,6 @@ void WindowManager::updateVisible() stats->setVisible(false); inventory->setVisible(false); console->disable(); - raceDialog->setVisible(false); // Mouse is visible whenever we're not in game mode gui->setVisiblePointer(isGuiMode()); @@ -81,6 +88,16 @@ void WindowManager::updateVisible() return; } + if (mode == GM_Race) + { + if (!raceDialog) + raceDialog = new RaceDialog (environment, raceChosen); + raceDialog->eventDone = MyGUI::newDelegate(this, &WindowManager::onRaceDialogDone); + raceDialog->eventBack = MyGUI::newDelegate(this, &WindowManager::onRaceDialogBack); + raceDialog->setVisible(true); + return; + } + if(mode == GM_Inventory) { // Ah, inventory mode. First, compute the effective set of @@ -125,12 +142,47 @@ void WindowManager::messageBox (const std::string& message, const std::vectorsetRace(environment.mMechanicsManager->getPlayerRace()); + //raceDialog->setGender(environment.mMechanicsManager->getPlayerMale() ? RaceDialog::GM_Male : RaceDialog::GM_Female); + // TODO: Face/Hair + } +} + void WindowManager::onRaceDialogDone() { - raceDialog->setVisible(false); + raceChosen = true; + if (raceDialog) + { + raceDialog->setVisible(false); + environment.mMechanicsManager->setPlayerRace(raceDialog->getRace(), raceDialog->getGender() == RaceDialog::GM_Male); + } + delete raceDialog; + raceDialog = nullptr; + + updateCharacterGeneration(); + + if (reviewNext) + setMode(GM_Review); + else if (classChosen) + setMode(GM_Class); } void WindowManager::onRaceDialogBack() { - raceDialog->setVisible(false); + if (raceDialog) + { + raceDialog->setVisible(false); + environment.mMechanicsManager->setPlayerRace(raceDialog->getRace(), raceDialog->getGender() == RaceDialog::GM_Male); + } + delete raceDialog; + raceDialog = nullptr; + + updateCharacterGeneration(); + + setMode(GM_Name); } diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index 3580db669..29f25eebc 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -79,6 +79,7 @@ namespace MWGui class WindowManager { + MWWorld::Environment& environment; HUD *hud; MapWindow *map; MainMenu *menu; @@ -86,8 +87,17 @@ namespace MWGui InventoryWindow *inventory; Console *console; + // Character creation RaceDialog *raceDialog; + // Which dialogs have been shown, controls back/next/ok buttons + bool nameChosen; + bool raceChosen; + bool classChosen; + bool birthChosen; + bool reviewNext; + ///< If true then any click on Next will cause the summary to be shown + MyGUI::Gui *gui; // Current gui mode @@ -155,6 +165,9 @@ namespace MWGui void messageBox (const std::string& message, const std::vector& buttons); private: + void updateCharacterGeneration(); + void checkCharacterGeneration(GuiMode mode); + void onRaceDialogDone(); void onRaceDialogBack(); };