Merge remote-tracking branch 'scrawl/insertrecords'

actorid
Marc Zinnschlag 12 years ago
commit 6f0ccb6e38

@ -137,8 +137,7 @@ namespace MWClass
fJumpAcrobaticsBase = gmst.find("fJumpAcrobaticsBase");
fJumpAcroMultiplier = gmst.find("fJumpAcroMultiplier");
fJumpRunMultiplier = gmst.find("fJumpRunMultiplier");
// Added in Tribunal/Bloodmoon, may not exist
fWereWolfRunMult = gmst.search("fWereWolfRunMult");
fWereWolfRunMult = gmst.find("fWereWolfRunMult");
inited = true;
}

@ -171,6 +171,25 @@ namespace MWWorld
return ptr;
}
template <class T>
const T *insertStatic(const T &x) {
Store<T> &store = const_cast<Store<T> &>(get<T>());
if (store.search(x.mId) != 0) {
std::ostringstream msg;
msg << "Try to override existing record '" << x.mId << "'";
throw std::runtime_error(msg.str());
}
T record = x;
T *ptr = store.insertStatic(record);
for (iterator it = mStores.begin(); it != mStores.end(); ++it) {
if (it->second == &store) {
mIds[ptr->mId] = it->first;
}
}
return ptr;
}
// This method must be called once, after loading all master/plugin files. This can only be done
// from the outside, so it must be public.
void setUp();

@ -74,15 +74,6 @@ namespace MWWorld
mVariables.insert (std::make_pair (iter->mId, std::make_pair (type, value)));
}
if (mVariables.find ("dayspassed")==mVariables.end())
{
// vanilla Morrowind does not define dayspassed.
Data value;
value.mLong = 1; // but the addons start counting at 1 :(
mVariables.insert (std::make_pair ("dayspassed", std::make_pair ('l', value)));
}
}
const Globals::Data& Globals::operator[] (const std::string& name) const

@ -92,6 +92,7 @@ namespace MWWorld
std::map<std::string, T> mDynamic;
typedef std::map<std::string, T> Dynamic;
typedef std::map<std::string, T> Static;
friend class ESMStore;
@ -183,6 +184,20 @@ namespace MWWorld
return ptr;
}
T *insertStatic(const T &item) {
std::string id = Misc::StringUtils::lowerCase(item.mId);
std::pair<typename Static::iterator, bool> result =
mStatic.insert(std::pair<std::string, T>(id, item));
T *ptr = &result.first->second;
if (result.second) {
mShared.push_back(ptr);
} else {
*ptr = item;
}
return ptr;
}
bool eraseStatic(const std::string &id) {
T item;
item.mId = Misc::StringUtils::lowerCase(id);

@ -211,6 +211,10 @@ namespace MWWorld
mStore.load (mEsm[idx]);
}
// insert records that may not be present in all versions of MW
if (mEsm[0].getFormat() == 0)
ensureNeededRecords();
mStore.setUp();
// global variables
@ -230,6 +234,41 @@ namespace MWWorld
}
void World::ensureNeededRecords()
{
if (!mStore.get<ESM::GameSetting>().search("sCompanionShare"))
{
ESM::GameSetting sCompanionShare;
sCompanionShare.mId = "sCompanionShare";
ESM::Variant value;
value.setType(ESM::VT_String);
value.setString("Companion Share");
sCompanionShare.mValue = value;
mStore.insertStatic(sCompanionShare);
}
if (!mStore.get<ESM::Global>().search("dayspassed"))
{
// vanilla Morrowind does not define dayspassed.
ESM::Global dayspassed;
dayspassed.mId = "dayspassed";
ESM::Variant value;
value.setType(ESM::VT_Long);
value.setInteger(1); // but the addons start counting at 1 :(
dayspassed.mValue = value;
mStore.insertStatic(dayspassed);
}
if (!mStore.get<ESM::GameSetting>().search("fWereWolfRunMult"))
{
ESM::GameSetting fWereWolfRunMult;
fWereWolfRunMult.mId = "fWereWolfRunMult";
ESM::Variant value;
value.setType(ESM::VT_Float);
value.setFloat(1.f);
fWereWolfRunMult.mValue = value;
mStore.insertStatic(fWereWolfRunMult);
}
}
World::~World()
{
delete mWeatherManager;

@ -115,9 +115,11 @@ namespace MWWorld
void addContainerScripts(const Ptr& reference, Ptr::CellStore* cell);
void PCDropped (const Ptr& item);
virtual void processDoors(float duration);
void processDoors(float duration);
///< Run physics simulation and modify \a world accordingly.
void ensureNeededRecords();
public:
World (OEngine::Render::OgreRenderer& renderer,

Loading…
Cancel
Save