Issue #61: Re-implemented tool selection in Alchemy class

actorid
Marc Zinnschlag 12 years ago
parent c6fd864a76
commit 42f02f3ccd

@ -1,7 +1,46 @@
#include "alchemy.hpp"
#include <algorithm>
#include <stdexcept>
#include "../mwworld/containerstore.hpp"
#include "../mwworld/class.hpp"
void MWMechanics::Alchemy::setAlchemist (const MWWorld::Ptr& 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
#define GAME_MWMECHANICS_ALCHEMY_H
#include <vector>
#include "../mwworld/ptr.hpp"
namespace MWMechanics
@ -8,13 +10,25 @@ namespace MWMechanics
/// \brief Potion creatin via alchemy skill
class Alchemy
{
public:
typedef std::vector<MWWorld::Ptr> TToolsContainer;
typedef TToolsContainer::const_iterator TToolsIterator;
private:
MWWorld::Ptr mNpc;
TToolsContainer mTools;
public:
void setAlchemist (const MWWorld::Ptr& npc);
///< Set alchemist and configure alchemy setup accordingly. \a npc may be empty to indicate that
/// there is no alchemist (alchemy session has ended).
TToolsIterator beginTools() const;
TToolsIterator endTools() const;
};
}

Loading…
Cancel
Save