forked from mirror/openmw-tes3mp
Issue #61: Re-implemented tool selection in Alchemy class
This commit is contained in:
parent
c6fd864a76
commit
42f02f3ccd
2 changed files with 53 additions and 0 deletions
|
@ -1,7 +1,46 @@
|
||||||
|
|
||||||
#include "alchemy.hpp"
|
#include "alchemy.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "../mwworld/containerstore.hpp"
|
||||||
|
#include "../mwworld/class.hpp"
|
||||||
|
|
||||||
void MWMechanics::Alchemy::setAlchemist (const MWWorld::Ptr& npc)
|
void MWMechanics::Alchemy::setAlchemist (const MWWorld::Ptr& npc)
|
||||||
{
|
{
|
||||||
mNpc = npc;
|
mNpc = npc;
|
||||||
|
|
||||||
|
mTools.resize (4);
|
||||||
|
|
||||||
|
std::fill (mTools.begin(), mTools.end(), MWWorld::Ptr());
|
||||||
|
|
||||||
|
MWWorld::ContainerStore& store = MWWorld::Class::get (npc).getContainerStore (npc);
|
||||||
|
|
||||||
|
for (MWWorld::ContainerStoreIterator iter (store.begin (MWWorld::ContainerStore::Type_Apparatus));
|
||||||
|
iter!=store.end(); ++iter)
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Apparatus>* ref = iter->get<ESM::Apparatus>();
|
||||||
|
|
||||||
|
int type = ref->base->data.type;
|
||||||
|
|
||||||
|
if (type<0 || type>=static_cast<int> (mTools.size()))
|
||||||
|
throw std::runtime_error ("invalid apparatus type");
|
||||||
|
|
||||||
|
if (!mTools[type].isEmpty())
|
||||||
|
if (ref->base->data.quality<=mTools[type].get<ESM::Apparatus>()->base->data.quality)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
mTools[type] = *iter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MWMechanics::Alchemy::TToolsIterator MWMechanics::Alchemy::beginTools() const
|
||||||
|
{
|
||||||
|
return mTools.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
MWMechanics::Alchemy::TToolsIterator MWMechanics::Alchemy::endTools() const
|
||||||
|
{
|
||||||
|
return mTools.end();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef GAME_MWMECHANICS_ALCHEMY_H
|
#ifndef GAME_MWMECHANICS_ALCHEMY_H
|
||||||
#define GAME_MWMECHANICS_ALCHEMY_H
|
#define GAME_MWMECHANICS_ALCHEMY_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
|
|
||||||
namespace MWMechanics
|
namespace MWMechanics
|
||||||
|
@ -8,13 +10,25 @@ namespace MWMechanics
|
||||||
/// \brief Potion creatin via alchemy skill
|
/// \brief Potion creatin via alchemy skill
|
||||||
class Alchemy
|
class Alchemy
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef std::vector<MWWorld::Ptr> TToolsContainer;
|
||||||
|
typedef TToolsContainer::const_iterator TToolsIterator;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
MWWorld::Ptr mNpc;
|
MWWorld::Ptr mNpc;
|
||||||
|
TToolsContainer mTools;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void setAlchemist (const MWWorld::Ptr& npc);
|
void setAlchemist (const MWWorld::Ptr& npc);
|
||||||
///< Set alchemist and configure alchemy setup accordingly. \a npc may be empty to indicate that
|
///< Set alchemist and configure alchemy setup accordingly. \a npc may be empty to indicate that
|
||||||
/// there is no alchemist (alchemy session has ended).
|
/// there is no alchemist (alchemy session has ended).
|
||||||
|
|
||||||
|
TToolsIterator beginTools() const;
|
||||||
|
|
||||||
|
TToolsIterator endTools() const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue