1
0
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:
Evil Eye 2023-06-18 22:55:05 +02:00
parent 9a4bfed852
commit 8edbb9f005
3 changed files with 72 additions and 168 deletions

View File

@ -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

View File

@ -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);

View File

@ -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">