Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/openmw-33' into openmw-33
Browse files Browse the repository at this point in the history
  • Loading branch information
zinnschlag committed Oct 27, 2014
2 parents 2fa44c3 + ba26879 commit 073478a
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 38 deletions.
8 changes: 7 additions & 1 deletion apps/openmw/mwgui/alchemywindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,12 @@ namespace MWGui
for (MWMechanics::Alchemy::TToolsIterator iter (mAlchemy.beginTools());
iter!=mAlchemy.endTools() && index<static_cast<int> (mApparatus.size()); ++iter, ++index)
{
mApparatus.at (index)->setItem(*iter);
mApparatus.at (index)->clearUserStrings();
if (!iter->isEmpty())
{
mApparatus.at (index)->setUserString ("ToolTipType", "ItemPtr");
mApparatus.at (index)->setUserData (*iter);
mApparatus.at (index)->setItem(*iter);
}
}

Expand Down Expand Up @@ -173,6 +174,11 @@ namespace MWGui

void AlchemyWindow::update()
{
std::string suggestedName = mAlchemy.suggestPotionName();
if (suggestedName != mSuggestedPotionName)
mNameEdit->setCaptionWithReplacing(suggestedName);
mSuggestedPotionName = suggestedName;

mSortModel->clearDragItems();

MWMechanics::Alchemy::TIngredientsIterator it = mAlchemy.beginIngredients ();
Expand Down
2 changes: 2 additions & 0 deletions apps/openmw/mwgui/alchemywindow.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ namespace MWGui
virtual void exit();

private:
std::string mSuggestedPotionName;

ItemView* mItemView;
SortFilterItemModel* mSortModel;

Expand Down
72 changes: 42 additions & 30 deletions apps/openmw/mwmechanics/alchemy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ void MWMechanics::Alchemy::updateEffects()
}
}

const ESM::Potion *MWMechanics::Alchemy::getRecord() const
const ESM::Potion *MWMechanics::Alchemy::getRecord(const ESM::Potion& toFind) const
{
const MWWorld::Store<ESM::Potion> &potions =
MWBase::Environment::get().getWorld()->getStore().get<ESM::Potion>();
Expand All @@ -216,6 +216,18 @@ const ESM::Potion *MWMechanics::Alchemy::getRecord() const
if (iter->mEffects.mList.size() != mEffects.size())
continue;

if (iter->mName != toFind.mName
|| iter->mScript != toFind.mScript
|| iter->mData.mWeight != toFind.mData.mWeight
|| iter->mData.mValue != toFind.mData.mValue
|| iter->mData.mAutoCalc != toFind.mData.mAutoCalc)
continue;

// Don't choose an ID that came from the content files, would have unintended side effects
// where alchemy can be used to produce quest-relevant items
if (!potions.isDynamic(iter->mId))
continue;

bool mismatch = false;

for (int i=0; i<static_cast<int> (iter->mEffects.mList.size()); ++i)
Expand Down Expand Up @@ -266,37 +278,34 @@ void MWMechanics::Alchemy::removeIngredients()

void MWMechanics::Alchemy::addPotion (const std::string& name)
{
const ESM::Potion *record = getRecord();

if (!record)
{
ESM::Potion newRecord;
ESM::Potion newRecord;

newRecord.mData.mWeight = 0;
newRecord.mData.mWeight = 0;

for (TIngredientsIterator iter (beginIngredients()); iter!=endIngredients(); ++iter)
if (!iter->isEmpty())
newRecord.mData.mWeight += iter->get<ESM::Ingredient>()->mBase->mData.mWeight;
for (TIngredientsIterator iter (beginIngredients()); iter!=endIngredients(); ++iter)
if (!iter->isEmpty())
newRecord.mData.mWeight += iter->get<ESM::Ingredient>()->mBase->mData.mWeight;

newRecord.mData.mWeight /= countIngredients();
newRecord.mData.mWeight /= countIngredients();

newRecord.mData.mValue = mValue;
newRecord.mData.mAutoCalc = 0;
newRecord.mData.mValue = mValue;
newRecord.mData.mAutoCalc = 0;

newRecord.mName = name;
newRecord.mName = name;

int index = static_cast<int> (std::rand()/(static_cast<double> (RAND_MAX)+1)*6);
assert (index>=0 && index<6);
int index = static_cast<int> (std::rand()/(static_cast<double> (RAND_MAX)+1)*6);
assert (index>=0 && index<6);

static const char *name[] = { "standard", "bargain", "cheap", "fresh", "exclusive", "quality" };
static const char *meshes[] = { "standard", "bargain", "cheap", "fresh", "exclusive", "quality" };

newRecord.mModel = "m\\misc_potion_" + std::string (name[index]) + "_01.nif";
newRecord.mIcon = "m\\tx_potion_" + std::string (name[index]) + "_01.dds";
newRecord.mModel = "m\\misc_potion_" + std::string (meshes[index]) + "_01.nif";
newRecord.mIcon = "m\\tx_potion_" + std::string (meshes[index]) + "_01.dds";

newRecord.mEffects.mList = mEffects;
newRecord.mEffects.mList = mEffects;

const ESM::Potion* record = getRecord(newRecord);
if (!record)
record = MWBase::Environment::get().getWorld()->createRecord (newRecord);
}

mAlchemist.getClass().getContainerStore (mAlchemist).add (record->mId, 1, mAlchemist);
}
Expand Down Expand Up @@ -436,14 +445,6 @@ MWMechanics::Alchemy::TEffectsIterator MWMechanics::Alchemy::endEffects() const
return mEffects.end();
}

std::string MWMechanics::Alchemy::getPotionName() const
{
if (const ESM::Potion *potion = getRecord())
return potion->mName;

return "";
}

MWMechanics::Alchemy::Result MWMechanics::Alchemy::create (const std::string& name)
{
if (mTools[ESM::Apparatus::MortarPestle].isEmpty())
Expand All @@ -452,7 +453,7 @@ MWMechanics::Alchemy::Result MWMechanics::Alchemy::create (const std::string& na
if (countIngredients()<2)
return Result_LessThanTwoIngredients;

if (name.empty() && getPotionName().empty())
if (name.empty())
return Result_NoName;

if (listEffects().empty())
Expand All @@ -479,3 +480,14 @@ MWMechanics::Alchemy::Result MWMechanics::Alchemy::create (const std::string& na

return Result_Success;
}

std::string MWMechanics::Alchemy::suggestPotionName()
{
std::set<MWMechanics::EffectKey> effects = listEffects();
if (effects.empty())
return "";

int effectId = effects.begin()->mId;
return MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find(
ESM::MagicEffect::effectIdToString(effectId))->getString();
}
13 changes: 6 additions & 7 deletions apps/openmw/mwmechanics/alchemy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,9 @@ namespace MWMechanics

void updateEffects();

const ESM::Potion *getRecord() const;
///< Return existing record for created potion (may return 0)
const ESM::Potion *getRecord(const ESM::Potion& toFind) const;
///< Try to find a potion record similar to \a toFind in the record store, or return 0 if not found
/// \note Does not account for record ID, model or icon

void removeIngredients();
///< Remove selected ingredients from alchemist's inventory, cleanup selected ingredients and
Expand Down Expand Up @@ -108,15 +109,13 @@ namespace MWMechanics
void removeIngredient (int index);
///< Remove ingredient from slot (calling this function on an empty slot is a no-op).

std::string getPotionName() const;
///< Return the name of the potion that would be created when calling create (if a record for such
/// a potion already exists) or return an empty string.
std::string suggestPotionName ();
///< Suggest a name for the potion, based on the current effects

Result create (const std::string& name);
///< Try to create a potion from the ingredients, place it in the inventory of the alchemist and
/// adjust the skills of the alchemist accordingly.
/// \param name must not be an empty string, unless there is already a potion record (
/// getPotionName() does not return an empty string).
/// \param name must not be an empty string, or Result_NoName is returned
};
}

Expand Down
1 change: 1 addition & 0 deletions apps/openmw/mwworld/esmstore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ void ESMStore::setUp()
mSkills.setUp();
mMagicEffects.setUp();
mAttributes.setUp();
mDialogs.setUp();
}

int ESMStore::countSavedGameRecords() const
Expand Down
19 changes: 19 additions & 0 deletions apps/openmw/mwworld/store.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1174,6 +1174,25 @@ namespace MWWorld
mShared.erase(mShared.begin() + mStatic.size(), mShared.end());
}

template<>
inline void Store<ESM::Dialogue>::setUp()
{
// DialInfos marked as deleted are kept during the loading phase, so that the linked list
// structure is kept intact for inserting further INFOs. Delete them now that loading is done.
for (Static::iterator it = mStatic.begin(); it != mStatic.end(); ++it)
{
ESM::Dialogue& dial = it->second;
dial.clearDeletedInfos();
}

mShared.clear();
mShared.reserve(mStatic.size());
std::map<std::string, ESM::Dialogue>::iterator it = mStatic.begin();
for (; it != mStatic.end(); ++it) {
mShared.push_back(&(it->second));
}
}

} //end namespace

#endif
11 changes: 11 additions & 0 deletions components/esm/loaddial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,15 @@ void Dialogue::readInfo(ESMReader &esm, bool merge)
std::cerr << "Failed to insert info " << id << std::endl;
}

void Dialogue::clearDeletedInfos()
{
for (InfoContainer::iterator it = mInfo.begin(); it != mInfo.end(); )
{
if (it->mQuestStatus == DialInfo::QS_Deleted)
it = mInfo.erase(it);
else
++it;
}
}

}
3 changes: 3 additions & 0 deletions components/esm/loaddial.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ struct Dialogue
void load(ESMReader &esm);
void save(ESMWriter &esm) const;

/// Remove all INFOs marked as QS_Deleted from mInfos.
void clearDeletedInfos();

/// Read the next info record
/// @param merge Merge with existing list, or just push each record to the end of the list?
void readInfo (ESM::ESMReader& esm, bool merge);
Expand Down

0 comments on commit 073478a

Please sign in to comment.