1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-15 16:49:55 +00:00
openmw-tes3mp/apps/openmw/mwgui/class.cpp

931 lines
32 KiB
C++
Raw Normal View History

#include "class.hpp"
2015-01-10 01:50:43 +00:00
#include <MyGUI_ImageBox.h>
#include <MyGUI_ListBox.h>
#include <MyGUI_Gui.h>
#include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp"
#include "../mwbase/windowmanager.hpp"
#include "../mwmechanics/actorutil.hpp"
#include "../mwworld/esmstore.hpp"
2018-08-14 19:05:43 +00:00
#include <components/debug/debuglog.hpp>
#include "tooltips.hpp"
2014-12-23 18:31:39 +00:00
namespace
{
bool sortClasses(const std::pair<std::string, std::string>& left, const std::pair<std::string, std::string>& right)
{
return left.second.compare(right.second) < 0;
}
}
2013-04-17 22:56:48 +00:00
namespace MWGui
{
2013-04-17 22:56:48 +00:00
/* GenerateClassResultDialog */
2013-04-17 22:56:48 +00:00
GenerateClassResultDialog::GenerateClassResultDialog()
: WindowModal("openmw_chargen_generate_class_result.layout")
{
setText("ReflectT", MWBase::Environment::get().getWindowManager()->getGameSettingString("sMessageQuestionAnswer1", ""));
2013-04-17 22:56:48 +00:00
getWidget(mClassImage, "ClassImage");
getWidget(mClassName, "ClassName");
2013-04-17 22:56:48 +00:00
MyGUI::Button* backButton;
getWidget(backButton, "BackButton");
backButton->setCaptionWithReplacing("#{sMessageQuestionAnswer3}");
2013-04-17 22:56:48 +00:00
backButton->eventMouseButtonClick += MyGUI::newDelegate(this, &GenerateClassResultDialog::onBackClicked);
2013-04-17 22:56:48 +00:00
MyGUI::Button* okButton;
getWidget(okButton, "OKButton");
okButton->setCaptionWithReplacing("#{sMessageQuestionAnswer2}");
2013-04-17 22:56:48 +00:00
okButton->eventMouseButtonClick += MyGUI::newDelegate(this, &GenerateClassResultDialog::onOkClicked);
center();
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
std::string GenerateClassResultDialog::getClassId() const
{
return mClassName->getCaption();
}
2013-04-17 22:56:48 +00:00
void GenerateClassResultDialog::setClassId(const std::string &classId)
{
mCurrentClassId = classId;
setClassImage(mClassImage, mCurrentClassId);
2013-04-17 22:56:48 +00:00
mClassName->setCaption(MWBase::Environment::get().getWorld()->getStore().get<ESM::Class>().find(mCurrentClassId)->mName);
center();
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
// widget controls
2013-04-17 22:56:48 +00:00
void GenerateClassResultDialog::onOkClicked(MyGUI::Widget* _sender)
{
eventDone(this);
}
2013-04-17 22:56:48 +00:00
void GenerateClassResultDialog::onBackClicked(MyGUI::Widget* _sender)
{
eventBack();
}
2013-04-17 22:56:48 +00:00
/* PickClassDialog */
2013-04-17 22:56:48 +00:00
PickClassDialog::PickClassDialog()
: WindowModal("openmw_chargen_class.layout")
2010-11-05 18:40:00 +00:00
{
2013-04-17 22:56:48 +00:00
// Centre dialog
center();
2013-04-17 22:56:48 +00:00
getWidget(mSpecializationName, "SpecializationName");
2013-04-17 22:56:48 +00:00
getWidget(mFavoriteAttribute[0], "FavoriteAttribute0");
getWidget(mFavoriteAttribute[1], "FavoriteAttribute1");
2013-04-17 22:56:48 +00:00
for(int i = 0; i < 5; i++)
{
char theIndex = '0'+i;
getWidget(mMajorSkill[i], std::string("MajorSkill").append(1, theIndex));
getWidget(mMinorSkill[i], std::string("MinorSkill").append(1, theIndex));
}
2013-04-17 22:56:48 +00:00
getWidget(mClassList, "ClassList");
mClassList->setScrollVisible(true);
mClassList->eventListSelectAccept += MyGUI::newDelegate(this, &PickClassDialog::onAccept);
2013-04-17 22:56:48 +00:00
mClassList->eventListChangePosition += MyGUI::newDelegate(this, &PickClassDialog::onSelectClass);
2013-04-17 22:56:48 +00:00
getWidget(mClassImage, "ClassImage");
2013-04-17 22:56:48 +00:00
MyGUI::Button* backButton;
getWidget(backButton, "BackButton");
backButton->eventMouseButtonClick += MyGUI::newDelegate(this, &PickClassDialog::onBackClicked);
2013-04-17 22:56:48 +00:00
MyGUI::Button* okButton;
getWidget(okButton, "OKButton");
okButton->eventMouseButtonClick += MyGUI::newDelegate(this, &PickClassDialog::onOkClicked);
2013-04-17 22:56:48 +00:00
updateClasses();
updateStats();
}
2013-04-17 22:56:48 +00:00
void PickClassDialog::setNextButtonShow(bool shown)
{
MyGUI::Button* okButton;
getWidget(okButton, "OKButton");
2013-04-17 22:56:48 +00:00
if (shown)
okButton->setCaption(MWBase::Environment::get().getWindowManager()->getGameSettingString("sNext", ""));
else
okButton->setCaption(MWBase::Environment::get().getWindowManager()->getGameSettingString("sOK", ""));
}
void PickClassDialog::onOpen()
{
WindowModal::onOpen ();
2013-04-17 22:56:48 +00:00
updateClasses();
updateStats();
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(mClassList);
// Show the current class by default
MWWorld::Ptr player = MWMechanics::getPlayer();
const std::string &classId =
player.get<ESM::NPC>()->mBase->mClass;
if (!classId.empty())
setClassId(classId);
}
2013-04-17 22:56:48 +00:00
void PickClassDialog::setClassId(const std::string &classId)
{
mCurrentClassId = classId;
mClassList->setIndexSelected(MyGUI::ITEM_NONE);
size_t count = mClassList->getItemCount();
for (size_t i = 0; i < count; ++i)
{
2014-01-14 08:47:31 +00:00
if (Misc::StringUtils::ciEqual(*mClassList->getItemDataAt<std::string>(i), classId))
2013-04-17 22:56:48 +00:00
{
mClassList->setIndexSelected(i);
break;
}
}
2013-04-17 22:56:48 +00:00
updateStats();
}
2013-04-17 22:56:48 +00:00
// widget controls
2013-04-17 22:56:48 +00:00
void PickClassDialog::onOkClicked(MyGUI::Widget* _sender)
{
if(mClassList->getIndexSelected() == MyGUI::ITEM_NONE)
return;
eventDone(this);
}
2013-04-17 22:56:48 +00:00
void PickClassDialog::onBackClicked(MyGUI::Widget* _sender)
{
eventBack();
}
void PickClassDialog::onAccept(MyGUI::ListBox* _sender, size_t _index)
{
onSelectClass(_sender, _index);
if(mClassList->getIndexSelected() == MyGUI::ITEM_NONE)
return;
eventDone(this);
}
2013-04-17 22:56:48 +00:00
void PickClassDialog::onSelectClass(MyGUI::ListBox* _sender, size_t _index)
{
if (_index == MyGUI::ITEM_NONE)
return;
2013-04-17 22:56:48 +00:00
const std::string *classId = mClassList->getItemDataAt<std::string>(_index);
2014-01-14 08:47:31 +00:00
if (Misc::StringUtils::ciEqual(mCurrentClassId, *classId))
2013-04-17 22:56:48 +00:00
return;
2013-04-17 22:56:48 +00:00
mCurrentClassId = *classId;
updateStats();
}
2013-04-17 22:56:48 +00:00
// update widget content
2011-04-21 08:49:45 +00:00
2013-04-17 22:56:48 +00:00
void PickClassDialog::updateClasses()
{
2013-04-17 22:56:48 +00:00
mClassList->removeAllItems();
2013-04-17 22:56:48 +00:00
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
std::vector<std::pair<std::string, std::string> > items; // class id, class name
for (const ESM::Class& classInfo : store.get<ESM::Class>())
{
bool playable = (classInfo.mData.mIsPlayable != 0);
2013-04-17 22:56:48 +00:00
if (!playable) // Only display playable classes
continue;
if (store.get<ESM::Class>().isDynamic(classInfo.mId))
continue; // custom-made class not relevant for this dialog
2020-10-17 08:26:35 +00:00
items.emplace_back(classInfo.mId, classInfo.mName);
2014-12-23 18:31:39 +00:00
}
std::sort(items.begin(), items.end(), sortClasses);
int index = 0;
for (auto& itemPair : items)
2014-12-23 18:31:39 +00:00
{
const std::string &id = itemPair.first;
mClassList->addItem(itemPair.second, id);
2013-04-17 22:56:48 +00:00
if (mCurrentClassId.empty())
{
mCurrentClassId = id;
mClassList->setIndexSelected(index);
}
2014-01-14 08:47:31 +00:00
else if (Misc::StringUtils::ciEqual(id, mCurrentClassId))
2013-04-17 22:56:48 +00:00
{
mClassList->setIndexSelected(index);
}
++index;
}
}
2013-04-17 22:56:48 +00:00
void PickClassDialog::updateStats()
{
if (mCurrentClassId.empty())
return;
const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
const ESM::Class *klass = store.get<ESM::Class>().search(mCurrentClassId);
if (!klass)
return;
2013-04-17 22:56:48 +00:00
ESM::Class::Specialization specialization = static_cast<ESM::Class::Specialization>(klass->mData.mSpecialization);
2013-04-17 22:56:48 +00:00
static const char *specIds[3] = {
"sSpecializationCombat",
"sSpecializationMagic",
"sSpecializationStealth"
};
std::string specName = MWBase::Environment::get().getWindowManager()->getGameSettingString(specIds[specialization], specIds[specialization]);
mSpecializationName->setCaption(specName);
ToolTips::createSpecializationToolTip(mSpecializationName, specName, specialization);
2013-04-17 22:56:48 +00:00
mFavoriteAttribute[0]->setAttributeId(klass->mData.mAttribute[0]);
mFavoriteAttribute[1]->setAttributeId(klass->mData.mAttribute[1]);
ToolTips::createAttributeToolTip(mFavoriteAttribute[0], mFavoriteAttribute[0]->getAttributeId());
ToolTips::createAttributeToolTip(mFavoriteAttribute[1], mFavoriteAttribute[1]->getAttributeId());
2013-04-17 22:56:48 +00:00
for (int i = 0; i < 5; ++i)
{
mMinorSkill[i]->setSkillNumber(klass->mData.mSkills[i][0]);
mMajorSkill[i]->setSkillNumber(klass->mData.mSkills[i][1]);
ToolTips::createSkillToolTip(mMinorSkill[i], klass->mData.mSkills[i][0]);
ToolTips::createSkillToolTip(mMajorSkill[i], klass->mData.mSkills[i][1]);
}
setClassImage(mClassImage, mCurrentClassId);
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
/* InfoBoxDialog */
2013-04-17 22:56:48 +00:00
void InfoBoxDialog::fitToText(MyGUI::TextBox* widget)
{
2013-04-17 22:56:48 +00:00
MyGUI::IntCoord inner = widget->getTextRegion();
MyGUI::IntCoord outer = widget->getCoord();
MyGUI::IntSize size = widget->getTextSize();
size.width += outer.width - inner.width;
size.height += outer.height - inner.height;
widget->setSize(size);
}
2013-04-17 22:56:48 +00:00
void InfoBoxDialog::layoutVertically(MyGUI::Widget* widget, int margin)
{
2013-04-17 22:56:48 +00:00
size_t count = widget->getChildCount();
int pos = 0;
pos += margin;
int width = 0;
for (unsigned i = 0; i < count; ++i)
{
MyGUI::Widget* child = widget->getChildAt(i);
if (!child->getVisible())
continue;
child->setPosition(child->getLeft(), pos);
width = std::max(width, child->getWidth());
pos += child->getHeight() + margin;
}
width += margin*2;
widget->setSize(width, pos);
}
2013-04-17 22:56:48 +00:00
InfoBoxDialog::InfoBoxDialog()
: WindowModal("openmw_infobox.layout")
{
getWidget(mTextBox, "TextBox");
getWidget(mText, "Text");
mText->getSubWidgetText()->setWordWrap(true);
getWidget(mButtonBar, "ButtonBar");
2013-04-17 22:56:48 +00:00
center();
}
2013-04-17 22:56:48 +00:00
void InfoBoxDialog::setText(const std::string &str)
{
mText->setCaption(str);
mTextBox->setVisible(!str.empty());
fitToText(mText);
}
2013-04-17 22:56:48 +00:00
std::string InfoBoxDialog::getText() const
{
return mText->getCaption();
}
void InfoBoxDialog::setButtons(ButtonList &buttons)
{
for (MyGUI::Button* button : this->mButtons)
{
MyGUI::Gui::getInstance().destroyWidget(button);
2013-04-17 22:56:48 +00:00
}
this->mButtons.clear();
// TODO: The buttons should be generated from a template in the layout file, ie. cloning an existing widget
MyGUI::Button* button;
MyGUI::IntCoord coord = MyGUI::IntCoord(0, 0, mButtonBar->getWidth(), 10);
for (const std::string &text : buttons)
2013-04-17 22:56:48 +00:00
{
button = mButtonBar->createWidget<MyGUI::Button>("MW_Button", coord, MyGUI::Align::Top | MyGUI::Align::HCenter, "");
button->getSubWidgetText()->setWordWrap(true);
button->setCaption(text);
fitToText(button);
button->eventMouseButtonClick += MyGUI::newDelegate(this, &InfoBoxDialog::onButtonClicked);
coord.top += button->getHeight();
this->mButtons.push_back(button);
}
}
void InfoBoxDialog::onOpen()
2013-04-17 22:56:48 +00:00
{
WindowModal::onOpen();
2013-04-17 22:56:48 +00:00
// Fix layout
layoutVertically(mTextBox, 4);
layoutVertically(mButtonBar, 6);
layoutVertically(mMainWidget, 4 + 6);
2013-04-17 22:56:48 +00:00
center();
}
2013-04-17 22:56:48 +00:00
void InfoBoxDialog::onButtonClicked(MyGUI::Widget* _sender)
{
int i = 0;
for (MyGUI::Button* button : mButtons)
2013-04-17 22:56:48 +00:00
{
if (button == _sender)
2013-04-17 22:56:48 +00:00
{
eventButtonSelected(i);
return;
}
++i;
}
}
2013-04-17 22:56:48 +00:00
/* ClassChoiceDialog */
2013-04-17 22:56:48 +00:00
ClassChoiceDialog::ClassChoiceDialog()
: InfoBoxDialog()
2010-11-05 18:40:31 +00:00
{
2013-04-17 22:56:48 +00:00
setText("");
ButtonList buttons;
buttons.push_back(MWBase::Environment::get().getWindowManager()->getGameSettingString("sClassChoiceMenu1", ""));
buttons.push_back(MWBase::Environment::get().getWindowManager()->getGameSettingString("sClassChoiceMenu2", ""));
buttons.push_back(MWBase::Environment::get().getWindowManager()->getGameSettingString("sClassChoiceMenu3", ""));
buttons.push_back(MWBase::Environment::get().getWindowManager()->getGameSettingString("sBack", ""));
setButtons(buttons);
2010-11-05 18:40:31 +00:00
}
2013-04-17 22:56:48 +00:00
/* CreateClassDialog */
CreateClassDialog::CreateClassDialog()
: WindowModal("openmw_chargen_create_class.layout")
2018-10-09 06:21:12 +00:00
, mSpecDialog(nullptr)
, mAttribDialog(nullptr)
, mSkillDialog(nullptr)
, mDescDialog(nullptr)
, mAffectedAttribute(nullptr)
, mAffectedSkill(nullptr)
{
2013-04-17 22:56:48 +00:00
// Centre dialog
center();
setText("SpecializationT", MWBase::Environment::get().getWindowManager()->getGameSettingString("sChooseClassMenu1", "Specialization"));
getWidget(mSpecializationName, "SpecializationName");
mSpecializationName->eventMouseButtonClick += MyGUI::newDelegate(this, &CreateClassDialog::onSpecializationClicked);
setText("FavoriteAttributesT", MWBase::Environment::get().getWindowManager()->getGameSettingString("sChooseClassMenu2", "Favorite Attributes:"));
getWidget(mFavoriteAttribute0, "FavoriteAttribute0");
getWidget(mFavoriteAttribute1, "FavoriteAttribute1");
mFavoriteAttribute0->eventClicked += MyGUI::newDelegate(this, &CreateClassDialog::onAttributeClicked);
mFavoriteAttribute1->eventClicked += MyGUI::newDelegate(this, &CreateClassDialog::onAttributeClicked);
setText("MajorSkillT", MWBase::Environment::get().getWindowManager()->getGameSettingString("sSkillClassMajor", ""));
setText("MinorSkillT", MWBase::Environment::get().getWindowManager()->getGameSettingString("sSkillClassMinor", ""));
for(int i = 0; i < 5; i++)
{
char theIndex = '0'+i;
getWidget(mMajorSkill[i], std::string("MajorSkill").append(1, theIndex));
getWidget(mMinorSkill[i], std::string("MinorSkill").append(1, theIndex));
mSkills.push_back(mMajorSkill[i]);
mSkills.push_back(mMinorSkill[i]);
}
for (Widgets::MWSkillPtr& skill : mSkills)
2013-04-17 22:56:48 +00:00
{
skill->eventClicked += MyGUI::newDelegate(this, &CreateClassDialog::onSkillClicked);
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
setText("LabelT", MWBase::Environment::get().getWindowManager()->getGameSettingString("sName", ""));
getWidget(mEditName, "EditName");
2013-04-17 22:56:48 +00:00
// Make sure the edit box has focus
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(mEditName);
2013-04-17 22:56:48 +00:00
MyGUI::Button* descriptionButton;
getWidget(descriptionButton, "DescriptionButton");
descriptionButton->eventMouseButtonClick += MyGUI::newDelegate(this, &CreateClassDialog::onDescriptionClicked);
2013-04-17 22:56:48 +00:00
MyGUI::Button* backButton;
getWidget(backButton, "BackButton");
backButton->eventMouseButtonClick += MyGUI::newDelegate(this, &CreateClassDialog::onBackClicked);
2013-04-17 22:56:48 +00:00
MyGUI::Button* okButton;
getWidget(okButton, "OKButton");
okButton->eventMouseButtonClick += MyGUI::newDelegate(this, &CreateClassDialog::onOkClicked);
2013-04-17 22:56:48 +00:00
// Set default skills, attributes
2013-04-17 22:56:48 +00:00
mFavoriteAttribute0->setAttributeId(ESM::Attribute::Strength);
mFavoriteAttribute1->setAttributeId(ESM::Attribute::Agility);
2013-04-17 22:56:48 +00:00
mMajorSkill[0]->setSkillId(ESM::Skill::Block);
mMajorSkill[1]->setSkillId(ESM::Skill::Armorer);
mMajorSkill[2]->setSkillId(ESM::Skill::MediumArmor);
mMajorSkill[3]->setSkillId(ESM::Skill::HeavyArmor);
mMajorSkill[4]->setSkillId(ESM::Skill::BluntWeapon);
2013-04-17 22:56:48 +00:00
mMinorSkill[0]->setSkillId(ESM::Skill::LongBlade);
mMinorSkill[1]->setSkillId(ESM::Skill::Axe);
mMinorSkill[2]->setSkillId(ESM::Skill::Spear);
mMinorSkill[3]->setSkillId(ESM::Skill::Athletics);
mMinorSkill[4]->setSkillId(ESM::Skill::Enchant);
2013-04-17 22:56:48 +00:00
setSpecialization(0);
update();
}
2013-04-17 22:56:48 +00:00
CreateClassDialog::~CreateClassDialog()
{
2013-04-17 22:56:48 +00:00
delete mSpecDialog;
delete mAttribDialog;
delete mSkillDialog;
delete mDescDialog;
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::update()
{
for (int i = 0; i < 5; ++i)
{
ToolTips::createSkillToolTip(mMajorSkill[i], mMajorSkill[i]->getSkillId());
ToolTips::createSkillToolTip(mMinorSkill[i], mMinorSkill[i]->getSkillId());
}
2013-04-17 22:56:48 +00:00
ToolTips::createAttributeToolTip(mFavoriteAttribute0, mFavoriteAttribute0->getAttributeId());
ToolTips::createAttributeToolTip(mFavoriteAttribute1, mFavoriteAttribute1->getAttributeId());
}
2013-04-17 22:56:48 +00:00
std::string CreateClassDialog::getName() const
{
return mEditName->getCaption();
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
std::string CreateClassDialog::getDescription() const
{
return mDescription;
}
2013-04-17 22:56:48 +00:00
ESM::Class::Specialization CreateClassDialog::getSpecializationId() const
2010-11-05 18:40:31 +00:00
{
2013-04-17 22:56:48 +00:00
return mSpecializationId;
2010-11-05 18:40:31 +00:00
}
2013-04-17 22:56:48 +00:00
std::vector<int> CreateClassDialog::getFavoriteAttributes() const
2010-11-05 18:40:31 +00:00
{
2013-04-17 22:56:48 +00:00
std::vector<int> v;
v.push_back(mFavoriteAttribute0->getAttributeId());
v.push_back(mFavoriteAttribute1->getAttributeId());
return v;
2010-11-05 18:40:31 +00:00
}
2013-04-17 22:56:48 +00:00
std::vector<ESM::Skill::SkillEnum> CreateClassDialog::getMajorSkills() const
{
std::vector<ESM::Skill::SkillEnum> v;
for(int i = 0; i < 5; i++)
{
v.push_back(mMajorSkill[i]->getSkillId());
}
return v;
}
2013-04-17 22:56:48 +00:00
std::vector<ESM::Skill::SkillEnum> CreateClassDialog::getMinorSkills() const
{
std::vector<ESM::Skill::SkillEnum> v;
for(int i=0; i < 5; i++)
{
v.push_back(mMinorSkill[i]->getSkillId());
}
return v;
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::setNextButtonShow(bool shown)
{
MyGUI::Button* okButton;
getWidget(okButton, "OKButton");
2013-04-17 22:56:48 +00:00
if (shown)
okButton->setCaption(MWBase::Environment::get().getWindowManager()->getGameSettingString("sNext", ""));
else
okButton->setCaption(MWBase::Environment::get().getWindowManager()->getGameSettingString("sOK", ""));
}
2013-04-17 22:56:48 +00:00
// widget controls
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onDialogCancel()
{
MWBase::Environment::get().getWindowManager()->removeDialog(mSpecDialog);
2020-11-13 07:39:47 +00:00
mSpecDialog = nullptr;
2013-04-17 22:56:48 +00:00
MWBase::Environment::get().getWindowManager()->removeDialog(mAttribDialog);
2020-11-13 07:39:47 +00:00
mAttribDialog = nullptr;
2013-04-17 22:56:48 +00:00
MWBase::Environment::get().getWindowManager()->removeDialog(mSkillDialog);
2020-11-13 07:39:47 +00:00
mSkillDialog = nullptr;
2013-04-17 22:56:48 +00:00
MWBase::Environment::get().getWindowManager()->removeDialog(mDescDialog);
2020-11-13 07:39:47 +00:00
mDescDialog = nullptr;
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onSpecializationClicked(MyGUI::Widget* _sender)
{
delete mSpecDialog;
mSpecDialog = new SelectSpecializationDialog();
mSpecDialog->eventCancel += MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel);
mSpecDialog->eventItemSelected += MyGUI::newDelegate(this, &CreateClassDialog::onSpecializationSelected);
mSpecDialog->setVisible(true);
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onSpecializationSelected()
{
mSpecializationId = mSpecDialog->getSpecializationId();
setSpecialization(mSpecializationId);
2013-04-17 22:56:48 +00:00
MWBase::Environment::get().getWindowManager()->removeDialog(mSpecDialog);
2020-11-13 07:39:47 +00:00
mSpecDialog = nullptr;
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::setSpecialization(int id)
{
2013-04-17 22:56:48 +00:00
mSpecializationId = (ESM::Class::Specialization) id;
static const char *specIds[3] = {
"sSpecializationCombat",
"sSpecializationMagic",
"sSpecializationStealth"
};
std::string specName = MWBase::Environment::get().getWindowManager()->getGameSettingString(specIds[mSpecializationId], specIds[mSpecializationId]);
mSpecializationName->setCaption(specName);
ToolTips::createSpecializationToolTip(mSpecializationName, specName, mSpecializationId);
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onAttributeClicked(Widgets::MWAttributePtr _sender)
{
2013-04-17 22:56:48 +00:00
delete mAttribDialog;
mAttribDialog = new SelectAttributeDialog();
mAffectedAttribute = _sender;
mAttribDialog->eventCancel += MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel);
mAttribDialog->eventItemSelected += MyGUI::newDelegate(this, &CreateClassDialog::onAttributeSelected);
mAttribDialog->setVisible(true);
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onAttributeSelected()
{
2013-04-17 22:56:48 +00:00
ESM::Attribute::AttributeID id = mAttribDialog->getAttributeId();
if (mAffectedAttribute == mFavoriteAttribute0)
{
if (mFavoriteAttribute1->getAttributeId() == id)
mFavoriteAttribute1->setAttributeId(mFavoriteAttribute0->getAttributeId());
}
else if (mAffectedAttribute == mFavoriteAttribute1)
{
2013-04-17 22:56:48 +00:00
if (mFavoriteAttribute0->getAttributeId() == id)
mFavoriteAttribute0->setAttributeId(mFavoriteAttribute1->getAttributeId());
}
2013-04-17 22:56:48 +00:00
mAffectedAttribute->setAttributeId(id);
MWBase::Environment::get().getWindowManager()->removeDialog(mAttribDialog);
2020-11-13 07:39:47 +00:00
mAttribDialog = nullptr;
2013-04-17 22:56:48 +00:00
update();
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onSkillClicked(Widgets::MWSkillPtr _sender)
{
delete mSkillDialog;
mSkillDialog = new SelectSkillDialog();
mAffectedSkill = _sender;
mSkillDialog->eventCancel += MyGUI::newDelegate(this, &CreateClassDialog::onDialogCancel);
mSkillDialog->eventItemSelected += MyGUI::newDelegate(this, &CreateClassDialog::onSkillSelected);
mSkillDialog->setVisible(true);
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onSkillSelected()
{
ESM::Skill::SkillEnum id = mSkillDialog->getSkillId();
2013-04-17 22:56:48 +00:00
// Avoid duplicate skills by swapping any skill field that matches the selected one
for (Widgets::MWSkillPtr& skill : mSkills)
2013-04-17 22:56:48 +00:00
{
if (skill == mAffectedSkill)
2013-04-17 22:56:48 +00:00
continue;
if (skill->getSkillId() == id)
2013-04-17 22:56:48 +00:00
{
skill->setSkillId(mAffectedSkill->getSkillId());
2013-04-17 22:56:48 +00:00
break;
}
}
2013-04-17 22:56:48 +00:00
mAffectedSkill->setSkillId(mSkillDialog->getSkillId());
MWBase::Environment::get().getWindowManager()->removeDialog(mSkillDialog);
2020-11-13 07:39:47 +00:00
mSkillDialog = nullptr;
2013-04-17 22:56:48 +00:00
update();
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onDescriptionClicked(MyGUI::Widget* _sender)
{
mDescDialog = new DescriptionDialog();
mDescDialog->setTextInput(mDescription);
mDescDialog->eventDone += MyGUI::newDelegate(this, &CreateClassDialog::onDescriptionEntered);
mDescDialog->setVisible(true);
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onDescriptionEntered(WindowBase* parWindow)
{
mDescription = mDescDialog->getTextInput();
MWBase::Environment::get().getWindowManager()->removeDialog(mDescDialog);
2020-11-13 07:39:47 +00:00
mDescDialog = nullptr;
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onOkClicked(MyGUI::Widget* _sender)
{
if(getName().size() <= 0)
return;
eventDone(this);
}
2013-04-17 22:56:48 +00:00
void CreateClassDialog::onBackClicked(MyGUI::Widget* _sender)
{
eventBack();
}
2013-04-17 22:56:48 +00:00
/* SelectSpecializationDialog */
2013-04-17 22:56:48 +00:00
SelectSpecializationDialog::SelectSpecializationDialog()
: WindowModal("openmw_chargen_select_specialization.layout")
{
// Centre dialog
center();
getWidget(mSpecialization0, "Specialization0");
getWidget(mSpecialization1, "Specialization1");
getWidget(mSpecialization2, "Specialization2");
std::string combat = MWBase::Environment::get().getWindowManager()->getGameSettingString(ESM::Class::sGmstSpecializationIds[ESM::Class::Combat], "");
std::string magic = MWBase::Environment::get().getWindowManager()->getGameSettingString(ESM::Class::sGmstSpecializationIds[ESM::Class::Magic], "");
std::string stealth = MWBase::Environment::get().getWindowManager()->getGameSettingString(ESM::Class::sGmstSpecializationIds[ESM::Class::Stealth], "");
mSpecialization0->setCaption(combat);
mSpecialization0->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectSpecializationDialog::onSpecializationClicked);
mSpecialization1->setCaption(magic);
mSpecialization1->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectSpecializationDialog::onSpecializationClicked);
mSpecialization2->setCaption(stealth);
mSpecialization2->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectSpecializationDialog::onSpecializationClicked);
mSpecializationId = ESM::Class::Combat;
2013-04-17 22:56:48 +00:00
ToolTips::createSpecializationToolTip(mSpecialization0, combat, ESM::Class::Combat);
ToolTips::createSpecializationToolTip(mSpecialization1, magic, ESM::Class::Magic);
ToolTips::createSpecializationToolTip(mSpecialization2, stealth, ESM::Class::Stealth);
2013-04-17 22:56:48 +00:00
MyGUI::Button* cancelButton;
getWidget(cancelButton, "CancelButton");
cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectSpecializationDialog::onCancelClicked);
}
2013-04-17 22:56:48 +00:00
SelectSpecializationDialog::~SelectSpecializationDialog()
{
}
2013-04-17 22:56:48 +00:00
// widget controls
2013-04-17 22:56:48 +00:00
void SelectSpecializationDialog::onSpecializationClicked(MyGUI::Widget* _sender)
{
2013-04-17 22:56:48 +00:00
if (_sender == mSpecialization0)
mSpecializationId = ESM::Class::Combat;
else if (_sender == mSpecialization1)
mSpecializationId = ESM::Class::Magic;
else if (_sender == mSpecialization2)
mSpecializationId = ESM::Class::Stealth;
else
return;
2013-04-17 22:56:48 +00:00
eventItemSelected();
}
2013-04-17 22:56:48 +00:00
void SelectSpecializationDialog::onCancelClicked(MyGUI::Widget* _sender)
{
exit();
}
2017-09-23 10:18:39 +00:00
bool SelectSpecializationDialog::exit()
2013-04-17 22:56:48 +00:00
{
eventCancel();
2017-09-23 10:18:39 +00:00
return true;
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
/* SelectAttributeDialog */
2013-04-17 22:56:48 +00:00
SelectAttributeDialog::SelectAttributeDialog()
: WindowModal("openmw_chargen_select_attribute.layout")
2013-07-31 16:46:32 +00:00
, mAttributeId(ESM::Attribute::Strength)
2013-04-17 22:56:48 +00:00
{
// Centre dialog
center();
2013-04-17 22:56:48 +00:00
for (int i = 0; i < 8; ++i)
{
Widgets::MWAttributePtr attribute;
char theIndex = '0'+i;
2013-04-17 22:56:48 +00:00
getWidget(attribute, std::string("Attribute").append(1, theIndex));
attribute->setAttributeId(ESM::Attribute::sAttributeIds[i]);
attribute->eventClicked += MyGUI::newDelegate(this, &SelectAttributeDialog::onAttributeClicked);
ToolTips::createAttributeToolTip(attribute, attribute->getAttributeId());
}
2013-04-17 22:56:48 +00:00
MyGUI::Button* cancelButton;
getWidget(cancelButton, "CancelButton");
cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectAttributeDialog::onCancelClicked);
}
2013-04-17 22:56:48 +00:00
SelectAttributeDialog::~SelectAttributeDialog()
{
}
2013-04-17 22:56:48 +00:00
// widget controls
2013-04-17 22:56:48 +00:00
void SelectAttributeDialog::onAttributeClicked(Widgets::MWAttributePtr _sender)
2010-11-05 17:51:42 +00:00
{
2013-04-17 22:56:48 +00:00
// TODO: Change MWAttribute to set and get AttributeID enum instead of int
mAttributeId = static_cast<ESM::Attribute::AttributeID>(_sender->getAttributeId());
eventItemSelected();
2010-11-05 17:51:42 +00:00
}
2013-04-17 22:56:48 +00:00
void SelectAttributeDialog::onCancelClicked(MyGUI::Widget* _sender)
{
exit();
}
2017-09-23 10:18:39 +00:00
bool SelectAttributeDialog::exit()
2013-04-17 22:56:48 +00:00
{
eventCancel();
2017-09-23 10:18:39 +00:00
return true;
2013-04-17 22:56:48 +00:00
}
/* SelectSkillDialog */
SelectSkillDialog::SelectSkillDialog()
: WindowModal("openmw_chargen_select_skill.layout")
, mSkillId(ESM::Skill::Block)
2013-04-17 22:56:48 +00:00
{
// Centre dialog
center();
for(int i = 0; i < 9; i++)
2011-04-21 08:49:45 +00:00
{
2013-04-17 22:56:48 +00:00
char theIndex = '0'+i;
getWidget(mCombatSkill[i], std::string("CombatSkill").append(1, theIndex));
getWidget(mMagicSkill[i], std::string("MagicSkill").append(1, theIndex));
getWidget(mStealthSkill[i], std::string("StealthSkill").append(1, theIndex));
}
2013-04-17 22:56:48 +00:00
struct {Widgets::MWSkillPtr widget; ESM::Skill::SkillEnum skillId;} mSkills[3][9] = {
{
{mCombatSkill[0], ESM::Skill::Block},
{mCombatSkill[1], ESM::Skill::Armorer},
{mCombatSkill[2], ESM::Skill::MediumArmor},
{mCombatSkill[3], ESM::Skill::HeavyArmor},
{mCombatSkill[4], ESM::Skill::BluntWeapon},
{mCombatSkill[5], ESM::Skill::LongBlade},
{mCombatSkill[6], ESM::Skill::Axe},
{mCombatSkill[7], ESM::Skill::Spear},
{mCombatSkill[8], ESM::Skill::Athletics}
},
{
{mMagicSkill[0], ESM::Skill::Enchant},
{mMagicSkill[1], ESM::Skill::Destruction},
{mMagicSkill[2], ESM::Skill::Alteration},
{mMagicSkill[3], ESM::Skill::Illusion},
{mMagicSkill[4], ESM::Skill::Conjuration},
{mMagicSkill[5], ESM::Skill::Mysticism},
{mMagicSkill[6], ESM::Skill::Restoration},
{mMagicSkill[7], ESM::Skill::Alchemy},
{mMagicSkill[8], ESM::Skill::Unarmored}
},
{
{mStealthSkill[0], ESM::Skill::Security},
{mStealthSkill[1], ESM::Skill::Sneak},
{mStealthSkill[2], ESM::Skill::Acrobatics},
{mStealthSkill[3], ESM::Skill::LightArmor},
{mStealthSkill[4], ESM::Skill::ShortBlade},
{mStealthSkill[5] ,ESM::Skill::Marksman},
{mStealthSkill[6] ,ESM::Skill::Mercantile},
{mStealthSkill[7] ,ESM::Skill::Speechcraft},
{mStealthSkill[8] ,ESM::Skill::HandToHand}
}
};
for (int spec = 0; spec < 3; ++spec)
{
2013-04-17 22:56:48 +00:00
for (int i = 0; i < 9; ++i)
{
mSkills[spec][i].widget->setSkillId(mSkills[spec][i].skillId);
mSkills[spec][i].widget->eventClicked += MyGUI::newDelegate(this, &SelectSkillDialog::onSkillClicked);
ToolTips::createSkillToolTip(mSkills[spec][i].widget, mSkills[spec][i].widget->getSkillId());
}
}
2013-04-17 22:56:48 +00:00
MyGUI::Button* cancelButton;
getWidget(cancelButton, "CancelButton");
cancelButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SelectSkillDialog::onCancelClicked);
}
2013-04-17 22:56:48 +00:00
SelectSkillDialog::~SelectSkillDialog()
{
}
2013-04-17 22:56:48 +00:00
// widget controls
2013-04-17 22:56:48 +00:00
void SelectSkillDialog::onSkillClicked(Widgets::MWSkillPtr _sender)
{
mSkillId = _sender->getSkillId();
eventItemSelected();
}
2013-04-17 22:56:48 +00:00
void SelectSkillDialog::onCancelClicked(MyGUI::Widget* _sender)
{
exit();
}
2017-09-23 10:18:39 +00:00
bool SelectSkillDialog::exit()
2013-04-17 22:56:48 +00:00
{
eventCancel();
2017-09-23 10:18:39 +00:00
return true;
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
/* DescriptionDialog */
2013-04-17 22:56:48 +00:00
DescriptionDialog::DescriptionDialog()
: WindowModal("openmw_chargen_class_description.layout")
{
// Centre dialog
center();
2013-04-17 22:56:48 +00:00
getWidget(mTextEdit, "TextEdit");
2013-04-17 22:56:48 +00:00
MyGUI::Button* okButton;
getWidget(okButton, "OKButton");
okButton->eventMouseButtonClick += MyGUI::newDelegate(this, &DescriptionDialog::onOkClicked);
okButton->setCaption(MWBase::Environment::get().getWindowManager()->getGameSettingString("sInputMenu1", ""));
2013-04-17 22:56:48 +00:00
// Make sure the edit box has focus
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(mTextEdit);
2013-04-17 22:56:48 +00:00
}
2013-04-17 22:56:48 +00:00
DescriptionDialog::~DescriptionDialog()
{
}
2013-04-17 22:56:48 +00:00
// widget controls
2013-04-17 22:56:48 +00:00
void DescriptionDialog::onOkClicked(MyGUI::Widget* _sender)
{
eventDone(this);
}
void setClassImage(MyGUI::ImageBox* imageBox, const std::string &classId)
{
std::string classImage = std::string("textures\\levelup\\") + classId + ".dds";
if (!MWBase::Environment::get().getWindowManager()->textureExists(classImage))
{
2018-08-14 19:05:43 +00:00
Log(Debug::Warning) << "No class image for " << classId << ", falling back to default";
classImage = "textures\\levelup\\warrior.dds";
}
imageBox->setImageTexture(classImage);
}
}