From ee101440a291894e933a3dc4e5eedaa55e1decd0 Mon Sep 17 00:00:00 2001 From: Jan Borsodi Date: Fri, 24 Sep 2010 15:28:14 +0200 Subject: [PATCH] Continued work on Class Create dialog. Added sub-dialogs for picking specialization, attribute and skill. Also added some definitions in ESM for attributes and specializations. --- CMakeLists.txt | 2 + apps/openmw/mwgui/class.cpp | 416 +++++++++++++++--- apps/openmw/mwgui/class.hpp | 128 +++++- apps/openmw/mwgui/widgets.cpp | 38 ++ apps/openmw/mwgui/widgets.hpp | 24 +- components/esm/attr.cpp | 36 ++ components/esm/attr.hpp | 42 ++ components/esm/class.cpp | 15 + components/esm/loadclas.hpp | 3 + components/esm/records.hpp | 3 + components/esm_store/store.cpp | 6 + components/esm_store/store.hpp | 3 + extern/mygui_3.0.1/CMakeLists.txt | 3 + .../openmw_chargen_create_class_layout.xml | 24 +- ...openmw_chargen_select_attribute_layout.xml | 29 ++ .../openmw_chargen_select_skill_layout.xml | 64 +++ ...w_chargen_select_specialization_layout.xml | 31 ++ .../openmw_resources/openmw_text.skin.xml | 25 ++ .../openmw_resources/openmw_windows.skin.xml | 45 +- 19 files changed, 856 insertions(+), 81 deletions(-) create mode 100644 components/esm/attr.cpp create mode 100644 components/esm/attr.hpp create mode 100644 components/esm/class.cpp create mode 100644 extern/mygui_3.0.1/openmw_resources/openmw_chargen_select_attribute_layout.xml create mode 100644 extern/mygui_3.0.1/openmw_resources/openmw_chargen_select_skill_layout.xml create mode 100644 extern/mygui_3.0.1/openmw_resources/openmw_chargen_select_specialization_layout.xml diff --git a/CMakeLists.txt b/CMakeLists.txt index 54f038d79..0ad1c5a9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,8 @@ file(GLOB ESM_HEADER ${COMP_DIR}/esm/*.hpp) set(ESM ${COMP_DIR}/esm/load_impl.cpp ${COMP_DIR}/esm/skill.cpp + ${COMP_DIR}/esm/attr.cpp + ${COMP_DIR}/esm/class.cpp ) source_group(components\\esm FILES ${ESM_HEADER} ${ESM}) diff --git a/apps/openmw/mwgui/class.cpp b/apps/openmw/mwgui/class.cpp index 6a0e3967f..b09d123eb 100644 --- a/apps/openmw/mwgui/class.cpp +++ b/apps/openmw/mwgui/class.cpp @@ -230,6 +230,9 @@ void PickClassDialog::updateStats() CreateClassDialog::CreateClassDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize) : Layout("openmw_chargen_create_class_layout.xml") , environment(environment) + , specDialog(nullptr) + , attribDialog(nullptr) + , skillDialog(nullptr) { // Centre dialog MyGUI::IntCoord coord = mMainWidget->getCoord(); @@ -240,12 +243,16 @@ CreateClassDialog::CreateClassDialog(MWWorld::Environment& environment, MyGUI::I WindowManager *wm = environment.mWindowManager; setText("SpecializationT", wm->getGameSettingString("sChooseClassMenu1", "Specialization")); getWidget(specializationName, "SpecializationName"); + specializationName->setCaption(wm->getGameSettingString(ESM::Class::gmstSpecializationIds[ESM::Class::Combat], "")); + specializationName->eventMouseButtonClick = MyGUI::newDelegate(this, &CreateClassDialog::onSpecializationClicked); setText("FavoriteAttributesT", wm->getGameSettingString("sChooseClassMenu2", "Favorite Attributes:")); getWidget(favoriteAttribute0, "FavoriteAttribute0"); getWidget(favoriteAttribute1, "FavoriteAttribute1"); favoriteAttribute0->setWindowManager(wm); favoriteAttribute1->setWindowManager(wm); + favoriteAttribute0->eventClicked = MyGUI::newDelegate(this, &CreateClassDialog::onAttributeClicked); + favoriteAttribute1->eventClicked = MyGUI::newDelegate(this, &CreateClassDialog::onAttributeClicked); setText("MajorSkillT", wm->getGameSettingString("sChooseClassMenu3", "Major Skills:")); getWidget(majorSkill0, "MajorSkill0"); @@ -253,11 +260,11 @@ CreateClassDialog::CreateClassDialog(MWWorld::Environment& environment, MyGUI::I getWidget(majorSkill2, "MajorSkill2"); getWidget(majorSkill3, "MajorSkill3"); getWidget(majorSkill4, "MajorSkill4"); - majorSkill0->setWindowManager(wm); - majorSkill1->setWindowManager(wm); - majorSkill2->setWindowManager(wm); - majorSkill3->setWindowManager(wm); - majorSkill4->setWindowManager(wm); + skills.push_back(majorSkill0); + skills.push_back(majorSkill1); + skills.push_back(majorSkill2); + skills.push_back(majorSkill3); + skills.push_back(majorSkill4); setText("MinorSkillT", wm->getGameSettingString("sChooseClassMenu4", "Minor Skills:")); getWidget(minorSkill0, "MinorSkill0"); @@ -265,15 +272,25 @@ CreateClassDialog::CreateClassDialog(MWWorld::Environment& environment, MyGUI::I getWidget(minorSkill2, "MinorSkill2"); getWidget(minorSkill3, "MinorSkill3"); getWidget(minorSkill4, "MinorSkill4"); - minorSkill0->setWindowManager(wm); - minorSkill1->setWindowManager(wm); - minorSkill2->setWindowManager(wm); - minorSkill3->setWindowManager(wm); - minorSkill4->setWindowManager(wm); + skills.push_back(minorSkill0); + skills.push_back(minorSkill1); + skills.push_back(minorSkill2); + skills.push_back(minorSkill3); + skills.push_back(minorSkill4); + + std::vector::const_iterator end = skills.end(); + for (std::vector::const_iterator it = skills.begin(); it != end; ++it) + { + (*it)->setWindowManager(wm); + (*it)->eventClicked = MyGUI::newDelegate(this, &CreateClassDialog::onSkillClicked); + } setText("LabelT", wm->getGameSettingString("sName", "")); getWidget(editName, "EditName"); + // Make sure the edit box has focus + MyGUI::InputManager::getInstance().setKeyFocusWidget(editName); + // TODO: These buttons should be managed by a Dialog class MyGUI::ButtonPtr descriptionButton; getWidget(descriptionButton, "DescriptionButton"); @@ -287,7 +304,29 @@ CreateClassDialog::CreateClassDialog(MWWorld::Environment& environment, MyGUI::I getWidget(okButton, "OKButton"); okButton->eventMouseButtonClick = MyGUI::newDelegate(this, &CreateClassDialog::onOkClicked); - updateStats(); + // Set default skills, attributes + + favoriteAttribute0->setAttributeId(ESM::Attribute::Strength); + favoriteAttribute1->setAttributeId(ESM::Attribute::Agility); + + majorSkill0->setSkillId(ESM::Skill::Block); + majorSkill1->setSkillId(ESM::Skill::Armorer); + majorSkill2->setSkillId(ESM::Skill::MediumArmor); + majorSkill3->setSkillId(ESM::Skill::HeavyArmor); + majorSkill4->setSkillId(ESM::Skill::BluntWeapon); + + minorSkill0->setSkillId(ESM::Skill::LongBlade); + minorSkill1->setSkillId(ESM::Skill::Axe); + minorSkill2->setSkillId(ESM::Skill::Spear); + minorSkill3->setSkillId(ESM::Skill::Athletics); + minorSkill4->setSkillId(ESM::Skill::Enchant); +} + +CreateClassDialog::~CreateClassDialog() +{ + delete specDialog; + delete attribDialog; + delete skillDialog; } void CreateClassDialog::setNextButtonShow(bool shown) @@ -322,29 +361,100 @@ void CreateClassDialog::setNextButtonShow(bool shown) void CreateClassDialog::open() { - updateStats(); setVisible(true); } +// widget controls + +void CreateClassDialog::onDialogCancel() +{ + if (specDialog) + specDialog->setVisible(false); + if (attribDialog) + attribDialog->setVisible(false); + if (skillDialog) + skillDialog->setVisible(false); + // TODO: Delete dialogs here +} -//void CreateClassDialog::setClassId(const std::string &classId) -//{ -// currentClassId = classId; -// classList->setIndexSelected(MyGUI::ITEM_NONE); -// size_t count = classList->getItemCount(); -// for (size_t i = 0; i < count; ++i) -// { -// if (boost::iequals(*classList->getItemDataAt(i), classId)) -// { -// classList->setIndexSelected(i); -// break; -// } -// } -// -// updateStats(); -//} +void CreateClassDialog::onSpecializationClicked(MyGUI::WidgetPtr _sender) +{ + if (specDialog) + delete specDialog; + specDialog = new SelectSpecializationDialog(environment, environment.mWindowManager->getGui()->getViewSize()); + specDialog->eventCancel = MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel); + specDialog->eventItemSelected = MyGUI::newDelegate(this, &CreateClassDialog::onSpecializationSelected); + specDialog->setVisible(true); +} -// widget controls +void CreateClassDialog::onSpecializationSelected() +{ + specializationId = specDialog->getSpecializationId(); + specializationName->setCaption(environment.mWindowManager->getGameSettingString(ESM::Class::gmstSpecializationIds[specializationId], "")); + specDialog->setVisible(false); +} + +void CreateClassDialog::onAttributeClicked(Widgets::MWAttributePtr _sender) +{ + if (attribDialog) + delete attribDialog; + attribDialog = new SelectAttributeDialog(environment, environment.mWindowManager->getGui()->getViewSize()); + attribDialog->setAffectedWidget(_sender); + attribDialog->eventCancel = MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel); + attribDialog->eventItemSelected = MyGUI::newDelegate(this, &CreateClassDialog::onAttributeSelected); + attribDialog->setVisible(true); +} + +void CreateClassDialog::onAttributeSelected() +{ + ESM::Attribute::AttributeID id = attribDialog->getAttributeId(); + Widgets::MWAttributePtr attribute = attribDialog->getAffectedWidget(); + if (attribute == favoriteAttribute0) + { + if (favoriteAttribute1->getAttributeId() == id) + favoriteAttribute1->setAttributeId(favoriteAttribute0->getAttributeId()); + } + else if (attribute == favoriteAttribute1) + { + if (favoriteAttribute0->getAttributeId() == id) + favoriteAttribute0->setAttributeId(favoriteAttribute1->getAttributeId()); + } + attribute->setAttributeId(id); + attribDialog->setVisible(false); +} + +void CreateClassDialog::onSkillClicked(Widgets::MWSkillPtr _sender) +{ + if (skillDialog) + delete skillDialog; + skillDialog = new SelectSkillDialog(environment, environment.mWindowManager->getGui()->getViewSize()); + skillDialog->setAffectedWidget(_sender); + skillDialog->eventCancel = MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel); + skillDialog->eventItemSelected = MyGUI::newDelegate(this, &CreateClassDialog::onSkillSelected); + skillDialog->setVisible(true); +} + +void CreateClassDialog::onSkillSelected() +{ + ESM::Skill::SkillEnum id = skillDialog->getSkillId(); + Widgets::MWSkillPtr skill = skillDialog->getAffectedWidget(); + + // Avoid duplicate skills by swapping any skill field that matches the selected one + std::vector::const_iterator end = skills.end(); + for (std::vector::const_iterator it = skills.begin(); it != end; ++it) + { + if (*it == skill) + continue; + if ((*it)->getSkillId() == id) + { + (*it)->setSkillId(skill->getSkillId()); + break; + } + } + + skill->setSkillId(skillDialog->getSkillId()); + skillDialog->setVisible(false); +} void CreateClassDialog::onDescriptionClicked(MyGUI::Widget* _sender) { @@ -361,46 +471,234 @@ void CreateClassDialog::onBackClicked(MyGUI::Widget* _sender) eventBack(); } -// update widget content +/* SelectSpecializationDialog */ -void CreateClassDialog::updateStats() +SelectSpecializationDialog::SelectSpecializationDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize) + : Layout("openmw_chargen_select_specialization_layout.xml") { - if (currentClassId.empty()) - return; + // Centre dialog + MyGUI::IntCoord coord = mMainWidget->getCoord(); + coord.left = (gameWindowSize.width - coord.width)/2; + coord.top = (gameWindowSize.height - coord.height)/2; + mMainWidget->setCoord(coord); + WindowManager *wm = environment.mWindowManager; - ESMS::ESMStore &store = environment.mWorld->getStore(); - const ESM::Class *klass = store.classes.find(currentClassId); - ESM::Class::Specialization specialization = static_cast(klass->data.specialization); + setText("LabelT", wm->getGameSettingString("sSpecializationMenu1", "")); - static const char *specIds[3] = { - "sSpecializationCombat", - "sSpecializationMagic", - "sSpecializationStealth" - }; - specializationName->setCaption(wm->getGameSettingString(specIds[specialization], specIds[specialization])); + getWidget(specialization0, "Specialization0"); + getWidget(specialization1, "Specialization1"); + getWidget(specialization2, "Specialization2"); + specialization0->setCaption(wm->getGameSettingString(ESM::Class::gmstSpecializationIds[ESM::Class::Combat], "")); + specialization0->eventMouseButtonClick = MyGUI::newDelegate(this, &SelectSpecializationDialog::onSpecializationClicked); + specialization1->setCaption(wm->getGameSettingString(ESM::Class::gmstSpecializationIds[ESM::Class::Magic], "")); + specialization1->eventMouseButtonClick = MyGUI::newDelegate(this, &SelectSpecializationDialog::onSpecializationClicked); + specialization2->setCaption(wm->getGameSettingString(ESM::Class::gmstSpecializationIds[ESM::Class::Stealth], "")); + specialization2->eventMouseButtonClick = MyGUI::newDelegate(this, &SelectSpecializationDialog::onSpecializationClicked); + specializationId = ESM::Class::Combat; - favoriteAttribute0->setAttributeId(klass->data.attribute[0]); - favoriteAttribute1->setAttributeId(klass->data.attribute[1]); + // TODO: These buttons should be managed by a Dialog class + MyGUI::ButtonPtr cancelButton; + getWidget(cancelButton, "CancelButton"); + cancelButton->setCaption(wm->getGameSettingString("sCancel", "")); + cancelButton->eventMouseButtonClick = MyGUI::newDelegate(this, &SelectSpecializationDialog::onCancelClicked); +} - Widgets::MWSkillPtr majorSkills[5] = { - majorSkill0, - majorSkill1, - majorSkill2, - majorSkill3, - majorSkill4 +// widget controls + +void SelectSpecializationDialog::onSpecializationClicked(MyGUI::WidgetPtr _sender) +{ + if (_sender == specialization0) + specializationId = ESM::Class::Combat; + else if (_sender == specialization1) + specializationId = ESM::Class::Magic; + else if (_sender == specialization2) + specializationId = ESM::Class::Stealth; + else + return; + + eventItemSelected(); +} + +void SelectSpecializationDialog::onCancelClicked(MyGUI::Widget* _sender) +{ + eventCancel(); +} + +/* SelectAttributeDialog */ + +SelectAttributeDialog::SelectAttributeDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize) + : Layout("openmw_chargen_select_attribute_layout.xml") +{ + // Centre dialog + MyGUI::IntCoord coord = mMainWidget->getCoord(); + coord.left = (gameWindowSize.width - coord.width)/2; + coord.top = (gameWindowSize.height - coord.height)/2; + mMainWidget->setCoord(coord); + + WindowManager *wm = environment.mWindowManager; + + setText("LabelT", wm->getGameSettingString("sAttributesMenu1", "")); + + getWidget(attribute0, "Attribute0"); + getWidget(attribute1, "Attribute1"); + getWidget(attribute2, "Attribute2"); + getWidget(attribute3, "Attribute3"); + getWidget(attribute4, "Attribute4"); + getWidget(attribute5, "Attribute5"); + getWidget(attribute6, "Attribute6"); + getWidget(attribute7, "Attribute7"); + + Widgets::MWAttributePtr attributes[8] = { + attribute0, + attribute1, + attribute2, + attribute3, + attribute4, + attribute5, + attribute6, + attribute7 }; - Widgets::MWSkillPtr minorSkills[5] = { - minorSkill0, - minorSkill1, - minorSkill2, - minorSkill3, - minorSkill4 + + for (int i = 0; i < 8; ++i) + { + attributes[i]->setWindowManager(wm); + attributes[i]->setAttributeId(ESM::Attribute::attributeIds[i]); + attributes[i]->eventClicked = MyGUI::newDelegate(this, &SelectAttributeDialog::onAttributeClicked); + } + + // TODO: These buttons should be managed by a Dialog class + MyGUI::ButtonPtr cancelButton; + getWidget(cancelButton, "CancelButton"); + cancelButton->setCaption(wm->getGameSettingString("sCancel", "")); + cancelButton->eventMouseButtonClick = MyGUI::newDelegate(this, &SelectAttributeDialog::onCancelClicked); +} + +// widget controls + +void SelectAttributeDialog::onAttributeClicked(Widgets::MWAttributePtr _sender) +{ + // TODO: Change MWAttribute to set and get AttributeID enum instead of int + attributeId = static_cast(_sender->getAttributeId()); + eventItemSelected(); +} + +void SelectAttributeDialog::onCancelClicked(MyGUI::Widget* _sender) +{ + eventCancel(); +} + + +/* SelectSkillDialog */ + +SelectSkillDialog::SelectSkillDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize) + : Layout("openmw_chargen_select_skill_layout.xml") +{ + // Centre dialog + MyGUI::IntCoord coord = mMainWidget->getCoord(); + coord.left = (gameWindowSize.width - coord.width)/2; + coord.top = (gameWindowSize.height - coord.height)/2; + mMainWidget->setCoord(coord); + + WindowManager *wm = environment.mWindowManager; + + setText("LabelT", wm->getGameSettingString("sSkillsMenu1", "")); + setText("CombatLabelT", wm->getGameSettingString("sSpecializationCombat", "")); + setText("MagicLabelT", wm->getGameSettingString("sSpecializationMagic", "")); + setText("StealthLabelT", wm->getGameSettingString("sSpecializationStealth", "")); + + getWidget(combatSkill0, "CombatSkill0"); + getWidget(combatSkill1, "CombatSkill1"); + getWidget(combatSkill2, "CombatSkill2"); + getWidget(combatSkill3, "CombatSkill3"); + getWidget(combatSkill4, "CombatSkill4"); + getWidget(combatSkill5, "CombatSkill5"); + getWidget(combatSkill6, "CombatSkill6"); + getWidget(combatSkill7, "CombatSkill7"); + getWidget(combatSkill8, "CombatSkill8"); + + getWidget(magicSkill0, "MagicSkill0"); + getWidget(magicSkill1, "MagicSkill1"); + getWidget(magicSkill2, "MagicSkill2"); + getWidget(magicSkill3, "MagicSkill3"); + getWidget(magicSkill4, "MagicSkill4"); + getWidget(magicSkill5, "MagicSkill5"); + getWidget(magicSkill6, "MagicSkill6"); + getWidget(magicSkill7, "MagicSkill7"); + getWidget(magicSkill8, "MagicSkill8"); + + getWidget(stealthSkill0, "StealthSkill0"); + getWidget(stealthSkill1, "StealthSkill1"); + getWidget(stealthSkill2, "StealthSkill2"); + getWidget(stealthSkill3, "StealthSkill3"); + getWidget(stealthSkill4, "StealthSkill4"); + getWidget(stealthSkill5, "StealthSkill5"); + getWidget(stealthSkill6, "StealthSkill6"); + getWidget(stealthSkill7, "StealthSkill7"); + getWidget(stealthSkill8, "StealthSkill8"); + + struct {Widgets::MWSkillPtr widget; ESM::Skill::SkillEnum skillId;} skills[3][9] = { + { + {combatSkill0, ESM::Skill::Block}, + {combatSkill1, ESM::Skill::Armorer}, + {combatSkill2, ESM::Skill::MediumArmor}, + {combatSkill3, ESM::Skill::HeavyArmor}, + {combatSkill4, ESM::Skill::BluntWeapon}, + {combatSkill5, ESM::Skill::LongBlade}, + {combatSkill6, ESM::Skill::Axe}, + {combatSkill7, ESM::Skill::Spear}, + {combatSkill8, ESM::Skill::Athletics} + }, + { + {magicSkill0, ESM::Skill::Enchant}, + {magicSkill1, ESM::Skill::Destruction}, + {magicSkill2, ESM::Skill::Alteration}, + {magicSkill3, ESM::Skill::Illusion}, + {magicSkill4, ESM::Skill::Conjuration}, + {magicSkill5, ESM::Skill::Mysticism}, + {magicSkill6, ESM::Skill::Restoration}, + {magicSkill7, ESM::Skill::Alchemy}, + {magicSkill8, ESM::Skill::Unarmored} + }, + { + {stealthSkill0, ESM::Skill::Security}, + {stealthSkill1, ESM::Skill::Sneak}, + {stealthSkill2, ESM::Skill::Acrobatics}, + {stealthSkill3, ESM::Skill::LightArmor}, + {stealthSkill4, ESM::Skill::ShortBlade}, + {stealthSkill5 ,ESM::Skill::Marksman}, + {stealthSkill6 ,ESM::Skill::Mercantile}, + {stealthSkill7 ,ESM::Skill::Speechcraft}, + {stealthSkill8 ,ESM::Skill::HandToHand} + } }; - for (int i = 0; i < 5; ++i) + for (int spec = 0; spec < 3; ++spec) { - majorSkills[i]->setSkillNumber(klass->data.skills[i][0]); - minorSkills[i]->setSkillNumber(klass->data.skills[i][1]); + for (int i = 0; i < 9; ++i) + { + skills[spec][i].widget->setWindowManager(wm); + skills[spec][i].widget->setSkillId(skills[spec][i].skillId); + skills[spec][i].widget->eventClicked = MyGUI::newDelegate(this, &SelectSkillDialog::onSkillClicked); + } } + + // TODO: These buttons should be managed by a Dialog class + MyGUI::ButtonPtr cancelButton; + getWidget(cancelButton, "CancelButton"); + cancelButton->setCaption(wm->getGameSettingString("sCancel", "")); + cancelButton->eventMouseButtonClick = MyGUI::newDelegate(this, &SelectSkillDialog::onCancelClicked); +} + +// widget controls + +void SelectSkillDialog::onSkillClicked(Widgets::MWSkillPtr _sender) +{ + skillId = _sender->getSkillId(); + eventItemSelected(); +} + +void SelectSkillDialog::onCancelClicked(MyGUI::Widget* _sender) +{ + eventCancel(); } diff --git a/apps/openmw/mwgui/class.hpp b/apps/openmw/mwgui/class.hpp index 5e8e80510..c01344338 100644 --- a/apps/openmw/mwgui/class.hpp +++ b/apps/openmw/mwgui/class.hpp @@ -69,10 +69,113 @@ namespace MWGui std::string currentClassId; }; + class SelectSpecializationDialog : public OEngine::GUI::Layout + { + public: + SelectSpecializationDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize); + + ESM::Class::Specialization getSpecializationId() const { return specializationId; } + + // Events + typedef delegates::CDelegate0 EventHandle_Void; + + /** Event : Cancel button clicked.\n + signature : void method()\n + */ + EventHandle_Void eventCancel; + + /** Event : Dialog finished, specialization selected.\n + signature : void method()\n + */ + EventHandle_Void eventItemSelected; + + protected: + void onSpecializationClicked(MyGUI::Widget* _sender); + void onCancelClicked(MyGUI::Widget* _sender); + + private: + MyGUI::WidgetPtr specialization0, specialization1, specialization2; + + ESM::Class::Specialization specializationId; + }; + + class SelectAttributeDialog : public OEngine::GUI::Layout + { + public: + SelectAttributeDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize); + + ESM::Attribute::AttributeID getAttributeId() const { return attributeId; } + Widgets::MWAttributePtr getAffectedWidget() const { return affectedWidget; } + void setAffectedWidget(Widgets::MWAttributePtr widget) { affectedWidget = widget; } + + // Events + typedef delegates::CDelegate0 EventHandle_Void; + + /** Event : Cancel button clicked.\n + signature : void method()\n + */ + EventHandle_Void eventCancel; + + /** Event : Dialog finished, attribute selected.\n + signature : void method()\n + */ + EventHandle_Void eventItemSelected; + + protected: + void onAttributeClicked(Widgets::MWAttributePtr _sender); + void onCancelClicked(MyGUI::Widget* _sender); + + private: + Widgets::MWAttributePtr attribute0, attribute1, attribute2, attribute3, + attribute4, attribute5, attribute6, attribute7; + Widgets::MWAttributePtr affectedWidget; + + ESM::Attribute::AttributeID attributeId; + }; + + class SelectSkillDialog : public OEngine::GUI::Layout + { + public: + SelectSkillDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize); + + ESM::Skill::SkillEnum getSkillId() const { return skillId; } + Widgets::MWSkillPtr getAffectedWidget() const { return affectedWidget; } + void setAffectedWidget(Widgets::MWSkillPtr widget) { affectedWidget = widget; } + + // Events + typedef delegates::CDelegate0 EventHandle_Void; + + /** Event : Cancel button clicked.\n + signature : void method()\n + */ + EventHandle_Void eventCancel; + + /** Event : Dialog finished, skill selected.\n + signature : void method()\n + */ + EventHandle_Void eventItemSelected; + + protected: + void onSkillClicked(Widgets::MWSkillPtr _sender); + void onCancelClicked(MyGUI::Widget* _sender); + + private: + Widgets::MWSkillPtr combatSkill0, combatSkill1, combatSkill2, combatSkill3, combatSkill4, + combatSkill5, combatSkill6, combatSkill7, combatSkill8; + Widgets::MWSkillPtr magicSkill0, magicSkill1, magicSkill2, magicSkill3, magicSkill4, + magicSkill5, magicSkill6, magicSkill7, magicSkill8; + Widgets::MWSkillPtr stealthSkill0, stealthSkill1, stealthSkill2, stealthSkill3, stealthSkill4, + stealthSkill5, stealthSkill6, stealthSkill7, stealthSkill8; + Widgets::MWSkillPtr affectedWidget; + + ESM::Skill::SkillEnum skillId; + }; + class CreateClassDialog : public OEngine::GUI::Layout { public: CreateClassDialog(MWWorld::Environment& environment, MyGUI::IntSize gameWindowSize); + virtual ~CreateClassDialog(); // const std::string &getClassId() const { return currentClassId; } // void setClassId(const std::string &classId); @@ -98,18 +201,29 @@ namespace MWGui void onOkClicked(MyGUI::Widget* _sender); void onBackClicked(MyGUI::Widget* _sender); - private: - void updateStats(); + void onSpecializationClicked(MyGUI::WidgetPtr _sender); + void onSpecializationSelected(); + void onAttributeClicked(Widgets::MWAttributePtr _sender); + void onAttributeSelected(); + void onSkillClicked(Widgets::MWSkillPtr _sender); + void onSkillSelected(); + void onDialogCancel(); + private: MWWorld::Environment& environment; - MyGUI::EditPtr editName; - MyGUI::StaticTextPtr specializationName; + MyGUI::EditPtr editName; + MyGUI::WidgetPtr specializationName; Widgets::MWAttributePtr favoriteAttribute0, favoriteAttribute1; - Widgets::MWSkillPtr majorSkill0, majorSkill1, majorSkill2, majorSkill3, majorSkill4; - Widgets::MWSkillPtr minorSkill0, minorSkill1, minorSkill2, minorSkill3, minorSkill4; + Widgets::MWSkillPtr majorSkill0, majorSkill1, majorSkill2, majorSkill3, majorSkill4; + Widgets::MWSkillPtr minorSkill0, minorSkill1, minorSkill2, minorSkill3, minorSkill4; + std::vector skills; - std::string currentClassId; + SelectSpecializationDialog *specDialog; + SelectAttributeDialog *attribDialog; + SelectSkillDialog *skillDialog; + + ESM::Class::Specialization specializationId; }; } #endif diff --git a/apps/openmw/mwgui/widgets.cpp b/apps/openmw/mwgui/widgets.cpp index e8b127591..f23a884a2 100644 --- a/apps/openmw/mwgui/widgets.cpp +++ b/apps/openmw/mwgui/widgets.cpp @@ -82,6 +82,11 @@ void MWSkill::updateWidgets() } } +void MWSkill::onClicked(MyGUI::Widget* _sender) +{ + eventClicked(this); +} + void MWSkill::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name) { Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name); @@ -116,6 +121,20 @@ void MWSkill::initialiseWidgetSkin(ResourceSkin* _info) MYGUI_DEBUG_ASSERT( ! skillValueWidget, "widget already assigned"); skillValueWidget = (*iter)->castType(); } + else if (name == "StatNameButton") + { + MYGUI_DEBUG_ASSERT( ! skillNameWidget, "widget already assigned"); + MyGUI::ButtonPtr button = (*iter)->castType