mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-07 21:40:11 +00:00
Add attributes to the level up dialog dynamically
This commit is contained in:
parent
9a4bfed852
commit
8edbb9f005
@ -3,8 +3,10 @@
|
||||
#include <MyGUI_Button.h>
|
||||
#include <MyGUI_EditBox.h>
|
||||
#include <MyGUI_ImageBox.h>
|
||||
#include <MyGUI_TextBox.h>
|
||||
|
||||
#include <components/fallback/fallback.hpp>
|
||||
#include <components/widgets/box.hpp>
|
||||
|
||||
#include "../mwbase/environment.hpp"
|
||||
#include "../mwbase/soundmanager.hpp"
|
||||
@ -12,6 +14,7 @@
|
||||
#include "../mwbase/world.hpp"
|
||||
|
||||
#include "../mwworld/class.hpp"
|
||||
#include "../mwworld/esmstore.hpp"
|
||||
|
||||
#include "../mwmechanics/actorutil.hpp"
|
||||
#include "../mwmechanics/creaturestats.hpp"
|
||||
@ -20,9 +23,13 @@
|
||||
#include "class.hpp"
|
||||
#include "ustring.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
constexpr unsigned int sMaxCoins = 3;
|
||||
constexpr int sCols[] = { 32, 218 };
|
||||
}
|
||||
namespace MWGui
|
||||
{
|
||||
const unsigned int LevelupDialog::sMaxCoins = 3;
|
||||
LevelupDialog::LevelupDialog()
|
||||
: WindowBase("openmw_levelup_dialog.layout")
|
||||
, mCoinCount(sMaxCoins)
|
||||
@ -36,23 +43,36 @@ namespace MWGui
|
||||
|
||||
mOkButton->eventMouseButtonClick += MyGUI::newDelegate(this, &LevelupDialog::onOkButtonClicked);
|
||||
|
||||
for (int i = 1; i < 9; ++i)
|
||||
{
|
||||
MyGUI::TextBox* t;
|
||||
getWidget(t, "AttribVal" + MyGUI::utility::toString(i));
|
||||
mAttributeValues.push_back(t);
|
||||
|
||||
MyGUI::Button* b;
|
||||
getWidget(b, "Attrib" + MyGUI::utility::toString(i));
|
||||
b->setUserData(i - 1);
|
||||
b->eventMouseButtonClick += MyGUI::newDelegate(this, &LevelupDialog::onAttributeClicked);
|
||||
mAttributes.push_back(b);
|
||||
|
||||
getWidget(t, "AttribMultiplier" + MyGUI::utility::toString(i));
|
||||
mAttributeMultipliers.push_back(t);
|
||||
const auto& store = MWBase::Environment::get().getESMStore()->get<ESM::Attribute>();
|
||||
const size_t perCol
|
||||
= static_cast<size_t>(std::ceil(store.getSize() / static_cast<float>(std::size(sCols))));
|
||||
size_t i = 0;
|
||||
for (const ESM::Attribute& attribute : store)
|
||||
{
|
||||
auto& widgets = mAttributeWidgets.emplace_back();
|
||||
const int offset = sCols[i / perCol];
|
||||
const int row = static_cast<int>(i % perCol);
|
||||
widgets.mMultiplier = mAssignWidget->createWidget<MyGUI::TextBox>(
|
||||
"SandTextVCenter", { offset, 20 * row, 100, 20 }, MyGUI::Align::Default);
|
||||
auto* hbox = mAssignWidget->createWidget<Gui::HBox>(
|
||||
{}, { offset + 20, 20 * row, 200, 20 }, MyGUI::Align::Default);
|
||||
widgets.mButton = hbox->createWidget<Gui::AutoSizedButton>("SandTextButton", {}, MyGUI::Align::Default);
|
||||
widgets.mButton->setUserData(attribute.mId);
|
||||
widgets.mButton->eventMouseButtonClick += MyGUI::newDelegate(this, &LevelupDialog::onAttributeClicked);
|
||||
widgets.mButton->setUserString("TextPadding", "0 0");
|
||||
widgets.mButton->setUserString("ToolTipType", "Layout");
|
||||
widgets.mButton->setUserString("ToolTipLayout", "AttributeToolTip");
|
||||
widgets.mButton->setUserString("Caption_AttributeName", attribute.mName);
|
||||
widgets.mButton->setUserString("Caption_AttributeDescription", attribute.mDescription);
|
||||
widgets.mButton->setUserString("ImageTexture_AttributeImage", attribute.mIcon);
|
||||
widgets.mButton->setCaption(attribute.mName);
|
||||
widgets.mValue = hbox->createWidget<Gui::AutoSizedTextBox>("SandText", {}, MyGUI::Align::Default);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < mCoinCount; ++i)
|
||||
for (unsigned int i = 0; i < sMaxCoins; ++i)
|
||||
{
|
||||
MyGUI::ImageBox* image = mCoinBox->createWidget<MyGUI::ImageBox>(
|
||||
"ImageBox", MyGUI::IntCoord(0, 0, 16, 16), MyGUI::Align::Default);
|
||||
@ -69,24 +89,24 @@ namespace MWGui
|
||||
MWMechanics::CreatureStats& creatureStats = player.getClass().getCreatureStats(player);
|
||||
MWMechanics::NpcStats& pcStats = player.getClass().getNpcStats(player);
|
||||
|
||||
for (int i = 0; i < ESM::Attribute::Length; ++i)
|
||||
for (const ESM::Attribute& attribute : MWBase::Environment::get().getESMStore()->get<ESM::Attribute>())
|
||||
{
|
||||
int val = creatureStats.getAttribute(i).getBase();
|
||||
if (std::find(mSpentAttributes.begin(), mSpentAttributes.end(), i) != mSpentAttributes.end())
|
||||
int val = creatureStats.getAttribute(attribute.mId).getBase();
|
||||
if (std::find(mSpentAttributes.begin(), mSpentAttributes.end(), attribute.mId) != mSpentAttributes.end())
|
||||
{
|
||||
val += pcStats.getLevelupAttributeMultiplier(i);
|
||||
val += pcStats.getLevelupAttributeMultiplier(attribute.mId);
|
||||
}
|
||||
|
||||
if (val >= 100)
|
||||
val = 100;
|
||||
|
||||
mAttributeValues[i]->setCaption(MyGUI::utility::toString(val));
|
||||
mAttributeWidgets[attribute.mId].mValue->setCaption(MyGUI::utility::toString(val));
|
||||
}
|
||||
}
|
||||
|
||||
void LevelupDialog::resetCoins()
|
||||
{
|
||||
const int coinSpacing = 33;
|
||||
constexpr int coinSpacing = 33;
|
||||
int curX = mCoinBox->getWidth() / 2 - (coinSpacing * (mCoinCount - 1) + 16 * mCoinCount) / 2;
|
||||
for (unsigned int i = 0; i < sMaxCoins; ++i)
|
||||
{
|
||||
@ -113,13 +133,14 @@ namespace MWGui
|
||||
image->detachFromWidget();
|
||||
image->attachToWidget(mAssignWidget);
|
||||
|
||||
int attribute = mSpentAttributes[i];
|
||||
const auto& attribute = mSpentAttributes[i];
|
||||
const auto& widgets = mAttributeWidgets[attribute];
|
||||
|
||||
int xdiff = mAttributeMultipliers[attribute]->getCaption().empty() ? 0 : 20;
|
||||
int xdiff = widgets.mMultiplier->getCaption().empty() ? 0 : 20;
|
||||
|
||||
MyGUI::IntPoint pos = mAttributes[attribute]->getAbsolutePosition() - mAssignWidget->getAbsolutePosition()
|
||||
MyGUI::IntPoint pos = widgets.mButton->getAbsolutePosition() - mAssignWidget->getAbsolutePosition()
|
||||
- MyGUI::IntPoint(22 + xdiff, 0);
|
||||
pos.top += (mAttributes[attribute]->getHeight() - image->getHeight()) / 2;
|
||||
pos.top += (widgets.mButton->getHeight() - image->getHeight()) / 2;
|
||||
image->setPosition(pos);
|
||||
}
|
||||
|
||||
@ -130,8 +151,8 @@ namespace MWGui
|
||||
{
|
||||
MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
MWWorld::Ptr player = world->getPlayerPtr();
|
||||
MWMechanics::CreatureStats& creatureStats = player.getClass().getCreatureStats(player);
|
||||
MWMechanics::NpcStats& pcStats = player.getClass().getNpcStats(player);
|
||||
const MWMechanics::CreatureStats& creatureStats = player.getClass().getCreatureStats(player);
|
||||
const MWMechanics::NpcStats& pcStats = player.getClass().getNpcStats(player);
|
||||
|
||||
setClassImage(mClassImage,
|
||||
ESM::RefId::stringRefId(getLevelupClassImage(pcStats.getSkillIncreasesForSpecialization(0),
|
||||
@ -149,28 +170,28 @@ namespace MWGui
|
||||
mLevelDescription->setCaption(toUString(levelupdescription));
|
||||
|
||||
unsigned int availableAttributes = 0;
|
||||
for (int i = 0; i < ESM::Attribute::Length; ++i)
|
||||
for (const ESM::Attribute& attribute : MWBase::Environment::get().getESMStore()->get<ESM::Attribute>())
|
||||
{
|
||||
MyGUI::TextBox* text = mAttributeMultipliers[i];
|
||||
if (pcStats.getAttribute(i).getBase() < 100)
|
||||
const auto& widgets = mAttributeWidgets[attribute.mId];
|
||||
if (pcStats.getAttribute(attribute.mId).getBase() < 100)
|
||||
{
|
||||
mAttributes[i]->setEnabled(true);
|
||||
mAttributeValues[i]->setEnabled(true);
|
||||
widgets.mButton->setEnabled(true);
|
||||
widgets.mValue->setEnabled(true);
|
||||
availableAttributes++;
|
||||
|
||||
float mult = pcStats.getLevelupAttributeMultiplier(i);
|
||||
mult = std::min(mult, 100 - pcStats.getAttribute(i).getBase());
|
||||
float mult = pcStats.getLevelupAttributeMultiplier(attribute.mId);
|
||||
mult = std::min(mult, 100 - pcStats.getAttribute(attribute.mId).getBase());
|
||||
if (mult <= 1)
|
||||
text->setCaption({});
|
||||
widgets.mMultiplier->setCaption({});
|
||||
else
|
||||
text->setCaption("x" + MyGUI::utility::toString(mult));
|
||||
widgets.mMultiplier->setCaption("x" + MyGUI::utility::toString(mult));
|
||||
}
|
||||
else
|
||||
{
|
||||
mAttributes[i]->setEnabled(false);
|
||||
mAttributeValues[i]->setEnabled(false);
|
||||
widgets.mButton->setEnabled(false);
|
||||
widgets.mValue->setEnabled(false);
|
||||
|
||||
text->setCaption({});
|
||||
widgets.mMultiplier->setCaption({});
|
||||
}
|
||||
}
|
||||
|
||||
@ -215,9 +236,9 @@ namespace MWGui
|
||||
|
||||
void LevelupDialog::onAttributeClicked(MyGUI::Widget* sender)
|
||||
{
|
||||
int attribute = *sender->getUserData<int>();
|
||||
auto attribute = *sender->getUserData<ESM::Attribute::AttributeID>();
|
||||
|
||||
std::vector<int>::iterator found = std::find(mSpentAttributes.begin(), mSpentAttributes.end(), attribute);
|
||||
auto found = std::find(mSpentAttributes.begin(), mSpentAttributes.end(), attribute);
|
||||
if (found != mSpentAttributes.end())
|
||||
mSpentAttributes.erase(found);
|
||||
else
|
||||
|
@ -1,6 +1,8 @@
|
||||
#ifndef MWGUI_LEVELUPDIALOG_H
|
||||
#define MWGUI_LEVELUPDIALOG_H
|
||||
|
||||
#include <components/esm/attr.hpp>
|
||||
|
||||
#include "windowbase.hpp"
|
||||
|
||||
namespace MWGui
|
||||
@ -14,6 +16,12 @@ namespace MWGui
|
||||
void onOpen() override;
|
||||
|
||||
private:
|
||||
struct Widgets
|
||||
{
|
||||
MyGUI::Button* mButton;
|
||||
MyGUI::TextBox* mValue;
|
||||
MyGUI::TextBox* mMultiplier;
|
||||
};
|
||||
MyGUI::Button* mOkButton;
|
||||
MyGUI::ImageBox* mClassImage;
|
||||
MyGUI::TextBox* mLevelText;
|
||||
@ -22,15 +30,12 @@ namespace MWGui
|
||||
MyGUI::Widget* mCoinBox;
|
||||
MyGUI::Widget* mAssignWidget;
|
||||
|
||||
std::vector<MyGUI::Button*> mAttributes;
|
||||
std::vector<MyGUI::TextBox*> mAttributeValues;
|
||||
std::vector<MyGUI::TextBox*> mAttributeMultipliers;
|
||||
std::vector<Widgets> mAttributeWidgets;
|
||||
std::vector<MyGUI::ImageBox*> mCoins;
|
||||
|
||||
std::vector<int> mSpentAttributes;
|
||||
std::vector<ESM::Attribute::AttributeID> mSpentAttributes;
|
||||
|
||||
unsigned int mCoinCount;
|
||||
static const unsigned int sMaxCoins;
|
||||
|
||||
void onOkButtonClicked(MyGUI::Widget* sender);
|
||||
void onAttributeClicked(MyGUI::Widget* sender);
|
||||
|
@ -30,128 +30,6 @@
|
||||
<Widget type="Widget" skin="" position="0 280 420 84" name="AssignWidget">
|
||||
<UserString key="HStretch" value="false"/>
|
||||
<UserString key="VStretch" value="false"/>
|
||||
|
||||
<Widget type="TextBox" skin="SandTextVCenter" position="32 0 100 20" name="AttribMultiplier1"/>
|
||||
<Widget type="TextBox" skin="SandTextVCenter" position="32 20 100 20" name="AttribMultiplier2"/>
|
||||
<Widget type="TextBox" skin="SandTextVCenter" position="32 40 100 20" name="AttribMultiplier3"/>
|
||||
<Widget type="TextBox" skin="SandTextVCenter" position="32 60 100 20" name="AttribMultiplier4"/>
|
||||
<Widget type="TextBox" skin="SandTextVCenter" position="218 0 100 20" name="AttribMultiplier5"/>
|
||||
<Widget type="TextBox" skin="SandTextVCenter" position="218 20 100 20" name="AttribMultiplier6"/>
|
||||
<Widget type="TextBox" skin="SandTextVCenter" position="218 40 100 20" name="AttribMultiplier7"/>
|
||||
<Widget type="TextBox" skin="SandTextVCenter" position="218 60 100 20" name="AttribMultiplier8"/>
|
||||
|
||||
<Widget type="HBox" position="52 0 200 20">
|
||||
<Widget type="AutoSizedButton" skin="SandTextButton" name="Attrib1">
|
||||
<UserString key="TextPadding" value="0 0"/>
|
||||
<UserString key="ToolTipType" value="Layout"/>
|
||||
<UserString key="ToolTipLayout" value="AttributeToolTip"/>
|
||||
<UserString key="Caption_AttributeName" value="#{sAttributeStrength}"/>
|
||||
<UserString key="Caption_AttributeDescription" value="#{sStrDesc}"/>
|
||||
<UserString key="ImageTexture_AttributeImage" value="icons\k\attribute_strength.dds"/>
|
||||
<Property key="Caption" value="#{sAttributeStrength}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedTextBox" skin="SandText" name="AttribVal1">
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
<Widget type="HBox" position="52 20 200 20">
|
||||
<Widget type="AutoSizedButton" skin="SandTextButton" name="Attrib2">
|
||||
<UserString key="TextPadding" value="0 0"/>
|
||||
<UserString key="ToolTipType" value="Layout"/>
|
||||
<UserString key="ToolTipLayout" value="AttributeToolTip"/>
|
||||
<UserString key="Caption_AttributeName" value="#{sAttributeIntelligence}"/>
|
||||
<UserString key="Caption_AttributeDescription" value="#{sIntDesc}"/>
|
||||
<UserString key="ImageTexture_AttributeImage" value="icons\k\attribute_int.dds"/>
|
||||
<Property key="Caption" value="#{sAttributeIntelligence}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedTextBox" skin="SandText" name="AttribVal2">
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
<Widget type="HBox" position="52 40 200 20">
|
||||
<Widget type="AutoSizedButton" skin="SandTextButton" name="Attrib3">
|
||||
<UserString key="TextPadding" value="0 0"/>
|
||||
<UserString key="ToolTipType" value="Layout"/>
|
||||
<UserString key="ToolTipLayout" value="AttributeToolTip"/>
|
||||
<UserString key="Caption_AttributeName" value="#{sAttributeWillpower}"/>
|
||||
<UserString key="Caption_AttributeDescription" value="#{sWilDesc}"/>
|
||||
<UserString key="ImageTexture_AttributeImage" value="icons\k\attribute_wilpower.dds"/>
|
||||
<Property key="Caption" value="#{sAttributeWillpower}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedTextBox" skin="SandText" name="AttribVal3">
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
<Widget type="HBox" position="52 60 200 20">
|
||||
<Widget type="AutoSizedButton" skin="SandTextButton" name="Attrib4">
|
||||
<UserString key="TextPadding" value="0 0"/>
|
||||
<UserString key="ToolTipType" value="Layout"/>
|
||||
<UserString key="ToolTipLayout" value="AttributeToolTip"/>
|
||||
<UserString key="Caption_AttributeName" value="#{sAttributeAgility}"/>
|
||||
<UserString key="Caption_AttributeDescription" value="#{sAgiDesc}"/>
|
||||
<UserString key="ImageTexture_AttributeImage" value="icons\k\attribute_agility.dds"/>
|
||||
<Property key="Caption" value="#{sAttributeAgility}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedTextBox" skin="SandText" name="AttribVal4">
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
|
||||
<Widget type="HBox" position="238 0 200 20">
|
||||
<Widget type="AutoSizedButton" skin="SandTextButton" name="Attrib5">
|
||||
<UserString key="TextPadding" value="0 0"/>
|
||||
<UserString key="ToolTipType" value="Layout"/>
|
||||
<UserString key="ToolTipLayout" value="AttributeToolTip"/>
|
||||
<UserString key="Caption_AttributeName" value="#{sAttributeSpeed}"/>
|
||||
<UserString key="Caption_AttributeDescription" value="#{sSpdDesc}"/>
|
||||
<UserString key="ImageTexture_AttributeImage" value="icons\k\attribute_speed.dds"/>
|
||||
<Property key="Caption" value="#{sAttributeSpeed}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedTextBox" skin="SandText" name="AttribVal5">
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
<Widget type="HBox" position="238 20 200 20">
|
||||
<Widget type="AutoSizedButton" skin="SandTextButton" name="Attrib6">
|
||||
<UserString key="TextPadding" value="0 0"/>
|
||||
<UserString key="ToolTipType" value="Layout"/>
|
||||
<UserString key="ToolTipLayout" value="AttributeToolTip"/>
|
||||
<UserString key="Caption_AttributeName" value="#{sAttributeEndurance}"/>
|
||||
<UserString key="Caption_AttributeDescription" value="#{sEndDesc}"/>
|
||||
<UserString key="ImageTexture_AttributeImage" value="icons\k\attribute_endurance.dds"/>
|
||||
<Property key="Caption" value="#{sAttributeEndurance}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedTextBox" skin="SandText" name="AttribVal6">
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
<Widget type="HBox" position="238 40 200 20">
|
||||
<Widget type="AutoSizedButton" skin="SandTextButton" name="Attrib7">
|
||||
<UserString key="TextPadding" value="0 0"/>
|
||||
<UserString key="ToolTipType" value="Layout"/>
|
||||
<UserString key="ToolTipLayout" value="AttributeToolTip"/>
|
||||
<UserString key="Caption_AttributeName" value="#{sAttributePersonality}"/>
|
||||
<UserString key="Caption_AttributeDescription" value="#{sPerDesc}"/>
|
||||
<UserString key="ImageTexture_AttributeImage" value="icons\k\attribute_personality.dds"/>
|
||||
<Property key="Caption" value="#{sAttributePersonality}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedTextBox" skin="SandText" name="AttribVal7">
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
<Widget type="HBox" position="238 60 200 20">
|
||||
<Widget type="AutoSizedButton" skin="SandTextButton" name="Attrib8">
|
||||
<UserString key="TextPadding" value="0 0"/>
|
||||
<UserString key="ToolTipType" value="Layout"/>
|
||||
<UserString key="ToolTipLayout" value="AttributeToolTip"/>
|
||||
<UserString key="Caption_AttributeName" value="#{sAttributeLuck}"/>
|
||||
<UserString key="Caption_AttributeDescription" value="#{sLucDesc}"/>
|
||||
<UserString key="ImageTexture_AttributeImage" value="icons\k\attribute_luck.dds"/>
|
||||
<Property key="Caption" value="#{sAttributeLuck}"/>
|
||||
</Widget>
|
||||
<Widget type="AutoSizedTextBox" skin="SandText" name="AttribVal8">
|
||||
</Widget>
|
||||
</Widget>
|
||||
</Widget>
|
||||
|
||||
<Widget type="HBox" skin="" position="0 0 330 24">
|
||||
|
Loading…
x
Reference in New Issue
Block a user