forked from teamnwah/openmw-tes3coop
Merge remote-tracking branch 'scrawl/master'
This commit is contained in:
commit
e71181810f
7 changed files with 124 additions and 80 deletions
|
@ -627,10 +627,10 @@ std::string bodyPartFlags(int flags)
|
||||||
std::string properties = "";
|
std::string properties = "";
|
||||||
if (flags == 0) properties += "[None] ";
|
if (flags == 0) properties += "[None] ";
|
||||||
if (flags & ESM::BodyPart::BPF_Female) properties += "Female ";
|
if (flags & ESM::BodyPart::BPF_Female) properties += "Female ";
|
||||||
if (flags & ESM::BodyPart::BPF_Playable) properties += "Playable ";
|
if (flags & ESM::BodyPart::BPF_NotPlayable) properties += "NotPlayable ";
|
||||||
int unused = (0xFFFFFFFF ^
|
int unused = (0xFFFFFFFF ^
|
||||||
(ESM::BodyPart::BPF_Female|
|
(ESM::BodyPart::BPF_Female|
|
||||||
ESM::BodyPart::BPF_Playable));
|
ESM::BodyPart::BPF_NotPlayable));
|
||||||
if (flags & unused) properties += "Invalid ";
|
if (flags & unused) properties += "Invalid ";
|
||||||
properties += str(boost::format("(0x%08X)") % flags);
|
properties += str(boost::format("(0x%08X)") % flags);
|
||||||
return properties;
|
return properties;
|
||||||
|
|
|
@ -23,6 +23,18 @@
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
bool isGold (const MWWorld::Ptr& ptr)
|
||||||
|
{
|
||||||
|
return Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_001")
|
||||||
|
|| Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_005")
|
||||||
|
|| Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_010")
|
||||||
|
|| Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_025")
|
||||||
|
|| Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_100");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace MWClass
|
namespace MWClass
|
||||||
{
|
{
|
||||||
void Miscellaneous::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const
|
void Miscellaneous::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const
|
||||||
|
@ -109,25 +121,15 @@ namespace MWClass
|
||||||
|
|
||||||
std::string Miscellaneous::getUpSoundId (const MWWorld::Ptr& ptr) const
|
std::string Miscellaneous::getUpSoundId (const MWWorld::Ptr& ptr) const
|
||||||
{
|
{
|
||||||
MWWorld::LiveCellRef<ESM::Miscellaneous> *ref =
|
if (isGold(ptr))
|
||||||
ptr.get<ESM::Miscellaneous>();
|
|
||||||
|
|
||||||
if (ref->mBase->mName == MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("sGold")->getString())
|
|
||||||
{
|
|
||||||
return std::string("Item Gold Up");
|
return std::string("Item Gold Up");
|
||||||
}
|
|
||||||
return std::string("Item Misc Up");
|
return std::string("Item Misc Up");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Miscellaneous::getDownSoundId (const MWWorld::Ptr& ptr) const
|
std::string Miscellaneous::getDownSoundId (const MWWorld::Ptr& ptr) const
|
||||||
{
|
{
|
||||||
MWWorld::LiveCellRef<ESM::Miscellaneous> *ref =
|
if (isGold(ptr))
|
||||||
ptr.get<ESM::Miscellaneous>();
|
|
||||||
|
|
||||||
if (ref->mBase->mName == MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find("sGold")->getString())
|
|
||||||
{
|
|
||||||
return std::string("Item Gold Down");
|
return std::string("Item Gold Down");
|
||||||
}
|
|
||||||
return std::string("Item Misc Down");
|
return std::string("Item Misc Down");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,19 +160,15 @@ namespace MWClass
|
||||||
|
|
||||||
int count = ptr.getRefData().getCount();
|
int count = ptr.getRefData().getCount();
|
||||||
|
|
||||||
bool isGold = Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_001")
|
bool gold = isGold(ptr);
|
||||||
|| Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_005")
|
|
||||||
|| Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_010")
|
|
||||||
|| Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_025")
|
|
||||||
|| Misc::StringUtils::ciEqual(ptr.getCellRef().mRefID, "gold_100");
|
|
||||||
|
|
||||||
if (isGold && ptr.getCellRef().mGoldValue != 1)
|
if (gold && ptr.getCellRef().mGoldValue != 1)
|
||||||
count = ptr.getCellRef().mGoldValue;
|
count = ptr.getCellRef().mGoldValue;
|
||||||
else if (isGold)
|
else if (gold)
|
||||||
count *= ref->mBase->mData.mValue;
|
count *= ref->mBase->mData.mValue;
|
||||||
|
|
||||||
std::string countString;
|
std::string countString;
|
||||||
if (!isGold)
|
if (!gold)
|
||||||
countString = MWGui::ToolTips::getCountString(count);
|
countString = MWGui::ToolTips::getCountString(count);
|
||||||
else // gold displays its count also if it's 1.
|
else // gold displays its count also if it's 1.
|
||||||
countString = " (" + boost::lexical_cast<std::string>(count) + ")";
|
countString = " (" + boost::lexical_cast<std::string>(count) + ")";
|
||||||
|
@ -186,7 +184,7 @@ namespace MWClass
|
||||||
|
|
||||||
std::string text;
|
std::string text;
|
||||||
|
|
||||||
if (!isGold)
|
if (!gold)
|
||||||
{
|
{
|
||||||
text += "\n#{sWeight}: " + MWGui::ToolTips::toString(ref->mBase->mData.mWeight);
|
text += "\n#{sWeight}: " + MWGui::ToolTips::toString(ref->mBase->mData.mWeight);
|
||||||
text += MWGui::ToolTips::getValueString(getValue(ptr), "#{sValue}");
|
text += MWGui::ToolTips::getValueString(getValue(ptr), "#{sValue}");
|
||||||
|
@ -210,7 +208,7 @@ namespace MWClass
|
||||||
const MWWorld::ESMStore &store =
|
const MWWorld::ESMStore &store =
|
||||||
MWBase::Environment::get().getWorld()->getStore();
|
MWBase::Environment::get().getWorld()->getStore();
|
||||||
|
|
||||||
if (MWWorld::Class::get(ptr).getName(ptr) == store.get<ESM::GameSetting>().find("sGold")->getString()) {
|
if (isGold(ptr)) {
|
||||||
int goldAmount = ptr.getRefData().getCount();
|
int goldAmount = ptr.getRefData().getCount();
|
||||||
|
|
||||||
std::string base = "Gold_001";
|
std::string base = "Gold_001";
|
||||||
|
|
|
@ -140,13 +140,8 @@ void ContainerBase::onSelectedItem(MyGUI::Widget* _sender)
|
||||||
|
|
||||||
if (isInventory())
|
if (isInventory())
|
||||||
{
|
{
|
||||||
const MWWorld::Store<ESM::GameSetting> &gmst =
|
|
||||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
|
||||||
|
|
||||||
// the player is trying to sell an item, check if the merchant accepts it
|
// the player is trying to sell an item, check if the merchant accepts it
|
||||||
// also, don't allow selling gold (let's be better than Morrowind at this, can we?)
|
if (!MWBase::Environment::get().getWindowManager()->getTradeWindow()->npcAcceptsItem(object))
|
||||||
if (!MWBase::Environment::get().getWindowManager()->getTradeWindow()->npcAcceptsItem(object) ||
|
|
||||||
MWWorld::Class::get(object).getName(object) == gmst.find("sGold")->getString())
|
|
||||||
{
|
{
|
||||||
// user notification "i don't buy this item"
|
// user notification "i don't buy this item"
|
||||||
MWBase::Environment::get().getWindowManager()->
|
MWBase::Environment::get().getWindowManager()->
|
||||||
|
|
|
@ -19,6 +19,49 @@
|
||||||
using namespace MWGui;
|
using namespace MWGui;
|
||||||
using namespace Widgets;
|
using namespace Widgets;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
int wrap(int index, int max)
|
||||||
|
{
|
||||||
|
if (index < 0)
|
||||||
|
return max - 1;
|
||||||
|
else if (index >= max)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
int countParts(const std::string &part, const std::string &race, bool male)
|
||||||
|
{
|
||||||
|
/// \todo loop through the whole store for appropriate bodyparts instead of looking for fixed IDs
|
||||||
|
const MWWorld::Store<ESM::BodyPart> &store =
|
||||||
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::BodyPart>();
|
||||||
|
|
||||||
|
std::string prefix =
|
||||||
|
"b_n_" + race + ((male) ? "_m_" : "_f_") + part;
|
||||||
|
|
||||||
|
std::string suffix;
|
||||||
|
suffix.reserve(prefix.size() + 3);
|
||||||
|
|
||||||
|
int count = -1;
|
||||||
|
do {
|
||||||
|
++count;
|
||||||
|
suffix = "_" + (boost::format("%02d") % (count + 1)).str();
|
||||||
|
}
|
||||||
|
while (store.search(prefix + suffix) != 0);
|
||||||
|
|
||||||
|
if (count == 0 && part == "hair") {
|
||||||
|
count = -1;
|
||||||
|
do {
|
||||||
|
++count;
|
||||||
|
suffix = (boost::format("%02d") % (count + 1)).str();
|
||||||
|
}
|
||||||
|
while (store.search(prefix + suffix) != 0);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RaceDialog::RaceDialog(MWBase::WindowManager& parWindowManager)
|
RaceDialog::RaceDialog(MWBase::WindowManager& parWindowManager)
|
||||||
: WindowModal("openmw_chargen_race.layout", parWindowManager)
|
: WindowModal("openmw_chargen_race.layout", parWindowManager)
|
||||||
, mGenderIndex(0)
|
, mGenderIndex(0)
|
||||||
|
@ -144,45 +187,6 @@ void RaceDialog::setRaceId(const std::string &raceId)
|
||||||
updateSpellPowers();
|
updateSpellPowers();
|
||||||
}
|
}
|
||||||
|
|
||||||
int wrap(int index, int max)
|
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
return max - 1;
|
|
||||||
else if (index >= max)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
int countParts(const std::string &part, const std::string &race, bool male)
|
|
||||||
{
|
|
||||||
const MWWorld::Store<ESM::BodyPart> &store =
|
|
||||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::BodyPart>();
|
|
||||||
|
|
||||||
std::string prefix =
|
|
||||||
"b_n_" + race + ((male) ? "_m_" : "_f_") + part;
|
|
||||||
|
|
||||||
std::string suffix;
|
|
||||||
suffix.reserve(prefix.size() + 3);
|
|
||||||
|
|
||||||
int count = -1;
|
|
||||||
do {
|
|
||||||
++count;
|
|
||||||
suffix = "_" + (boost::format("%02d") % (count + 1)).str();
|
|
||||||
}
|
|
||||||
while (store.search(prefix + suffix) != 0);
|
|
||||||
|
|
||||||
if (count == 0 && part == "hair") {
|
|
||||||
count = -1;
|
|
||||||
do {
|
|
||||||
++count;
|
|
||||||
suffix = (boost::format("%02d") % (count + 1)).str();
|
|
||||||
}
|
|
||||||
while (store.search(prefix + suffix) != 0);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RaceDialog::close()
|
void RaceDialog::close()
|
||||||
{
|
{
|
||||||
delete mPreview;
|
delete mPreview;
|
||||||
|
@ -229,28 +233,67 @@ void RaceDialog::onSelectNextGender(MyGUI::Widget*)
|
||||||
|
|
||||||
void RaceDialog::onSelectPreviousFace(MyGUI::Widget*)
|
void RaceDialog::onSelectPreviousFace(MyGUI::Widget*)
|
||||||
{
|
{
|
||||||
mFaceIndex = wrap(mFaceIndex - 1, mFaceCount);
|
do
|
||||||
|
mFaceIndex = wrap(mFaceIndex - 1, mFaceCount);
|
||||||
|
while (!isFacePlayable());
|
||||||
updatePreview();
|
updatePreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RaceDialog::onSelectNextFace(MyGUI::Widget*)
|
void RaceDialog::onSelectNextFace(MyGUI::Widget*)
|
||||||
{
|
{
|
||||||
mFaceIndex = wrap(mFaceIndex + 1, mFaceCount);
|
do
|
||||||
|
mFaceIndex = wrap(mFaceIndex + 1, mFaceCount);
|
||||||
|
while (!isFacePlayable());
|
||||||
updatePreview();
|
updatePreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RaceDialog::onSelectPreviousHair(MyGUI::Widget*)
|
void RaceDialog::onSelectPreviousHair(MyGUI::Widget*)
|
||||||
{
|
{
|
||||||
mHairIndex = wrap(mHairIndex - 1, mHairCount);
|
do
|
||||||
|
mHairIndex = wrap(mHairIndex - 1, mHairCount);
|
||||||
|
while (!isHairPlayable());
|
||||||
updatePreview();
|
updatePreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RaceDialog::onSelectNextHair(MyGUI::Widget*)
|
void RaceDialog::onSelectNextHair(MyGUI::Widget*)
|
||||||
{
|
{
|
||||||
mHairIndex = wrap(mHairIndex + 1, mHairCount);
|
do
|
||||||
|
mHairIndex = wrap(mHairIndex + 1, mHairCount);
|
||||||
|
while (!isHairPlayable());
|
||||||
updatePreview();
|
updatePreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RaceDialog::isFacePlayable()
|
||||||
|
{
|
||||||
|
std::string prefix =
|
||||||
|
"b_n_" + mCurrentRaceId + ((mGenderIndex == 0) ? "_m_" : "_f_");
|
||||||
|
|
||||||
|
std::string headIndex = (boost::format("%02d") % (mFaceIndex + 1)).str();
|
||||||
|
|
||||||
|
const MWWorld::Store<ESM::BodyPart> &parts =
|
||||||
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::BodyPart>();
|
||||||
|
|
||||||
|
if (parts.search(prefix + "head_" + headIndex) == 0)
|
||||||
|
return !(parts.find(prefix + "head" + headIndex)->mData.mFlags & ESM::BodyPart::BPF_NotPlayable);
|
||||||
|
else
|
||||||
|
return !(parts.find(prefix + "head_" + headIndex)->mData.mFlags & ESM::BodyPart::BPF_NotPlayable);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RaceDialog::isHairPlayable()
|
||||||
|
{
|
||||||
|
std::string prefix =
|
||||||
|
"b_n_" + mCurrentRaceId + ((mGenderIndex == 0) ? "_m_" : "_f_");
|
||||||
|
|
||||||
|
std::string hairIndex = (boost::format("%02d") % (mHairIndex + 1)).str();
|
||||||
|
|
||||||
|
const MWWorld::Store<ESM::BodyPart> &parts =
|
||||||
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::BodyPart>();
|
||||||
|
if (parts.search(prefix + "hair_" + hairIndex) == 0)
|
||||||
|
return !(parts.find(prefix + "hair" + hairIndex)->mData.mFlags & ESM::BodyPart::BPF_NotPlayable);
|
||||||
|
else
|
||||||
|
return !(parts.find(prefix + "hair_" + hairIndex)->mData.mFlags & ESM::BodyPart::BPF_NotPlayable);
|
||||||
|
}
|
||||||
|
|
||||||
void RaceDialog::onSelectRace(MyGUI::ListBox* _sender, size_t _index)
|
void RaceDialog::onSelectRace(MyGUI::ListBox* _sender, size_t _index)
|
||||||
{
|
{
|
||||||
if (_index == MyGUI::ITEM_NONE)
|
if (_index == MyGUI::ITEM_NONE)
|
||||||
|
@ -273,11 +316,16 @@ void RaceDialog::onSelectRace(MyGUI::ListBox* _sender, size_t _index)
|
||||||
|
|
||||||
void RaceDialog::recountParts()
|
void RaceDialog::recountParts()
|
||||||
{
|
{
|
||||||
|
mFaceCount = countParts("head", mCurrentRaceId, mGenderIndex == 0);
|
||||||
|
mHairCount = countParts("hair", mCurrentRaceId, mGenderIndex == 0);
|
||||||
|
|
||||||
mFaceIndex = 0;
|
mFaceIndex = 0;
|
||||||
mHairIndex = 0;
|
mHairIndex = 0;
|
||||||
|
|
||||||
mFaceCount = countParts("head", mCurrentRaceId, mGenderIndex == 0);
|
while (!isHairPlayable())
|
||||||
mHairCount = countParts("hair", mCurrentRaceId, mGenderIndex == 0);
|
mHairIndex = wrap(mHairIndex + 1, mHairCount);
|
||||||
|
while (!isFacePlayable())
|
||||||
|
mFaceIndex = wrap(mFaceIndex + 1, mFaceCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// update widget content
|
// update widget content
|
||||||
|
|
|
@ -81,6 +81,9 @@ namespace MWGui
|
||||||
void updatePreview();
|
void updatePreview();
|
||||||
void recountParts();
|
void recountParts();
|
||||||
|
|
||||||
|
bool isHairPlayable();
|
||||||
|
bool isFacePlayable();
|
||||||
|
|
||||||
MyGUI::ImageBox* mPreviewImage;
|
MyGUI::ImageBox* mPreviewImage;
|
||||||
MyGUI::ListBox* mRaceList;
|
MyGUI::ListBox* mRaceList;
|
||||||
MyGUI::ScrollBar* mHeadRotate;
|
MyGUI::ScrollBar* mHeadRotate;
|
||||||
|
|
|
@ -129,13 +129,10 @@ namespace MWGui
|
||||||
MWWorld::Ptr gold;
|
MWWorld::Ptr gold;
|
||||||
MWWorld::ContainerStore& playerStore = mWindowManager.getInventoryWindow()->getContainerStore();
|
MWWorld::ContainerStore& playerStore = mWindowManager.getInventoryWindow()->getContainerStore();
|
||||||
|
|
||||||
const MWWorld::Store<ESM::GameSetting> &gmst =
|
|
||||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
|
||||||
|
|
||||||
for (MWWorld::ContainerStoreIterator it = playerStore.begin();
|
for (MWWorld::ContainerStoreIterator it = playerStore.begin();
|
||||||
it != playerStore.end(); ++it)
|
it != playerStore.end(); ++it)
|
||||||
{
|
{
|
||||||
if (MWWorld::Class::get(*it).getName(*it) == gmst.find("sGold")->getString())
|
if (Misc::StringUtils::ciEqual(it->getCellRef().mRefID, "gold_001"))
|
||||||
{
|
{
|
||||||
goldFound = true;
|
goldFound = true;
|
||||||
gold = *it;
|
gold = *it;
|
||||||
|
@ -342,6 +339,9 @@ namespace MWGui
|
||||||
|
|
||||||
bool TradeWindow::npcAcceptsItem(MWWorld::Ptr item)
|
bool TradeWindow::npcAcceptsItem(MWWorld::Ptr item)
|
||||||
{
|
{
|
||||||
|
if (Misc::StringUtils::ciEqual(item.getCellRef().mRefID, "gold_001"))
|
||||||
|
return false;
|
||||||
|
|
||||||
int services = 0;
|
int services = 0;
|
||||||
if (mPtr.getTypeName() == typeid(ESM::NPC).name())
|
if (mPtr.getTypeName() == typeid(ESM::NPC).name())
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,7 +33,7 @@ struct BodyPart
|
||||||
enum Flags
|
enum Flags
|
||||||
{
|
{
|
||||||
BPF_Female = 1,
|
BPF_Female = 1,
|
||||||
BPF_Playable = 2
|
BPF_NotPlayable = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MeshType
|
enum MeshType
|
||||||
|
|
Loading…
Reference in a new issue