diff --git a/apps/opencs/model/world/infocollection.cpp b/apps/opencs/model/world/infocollection.cpp index 215354f593..a63d3bce41 100644 --- a/apps/opencs/model/world/infocollection.cpp +++ b/apps/opencs/model/world/infocollection.cpp @@ -1,6 +1,8 @@ #include "infocollection.hpp" +#include + #include #include @@ -17,7 +19,7 @@ void CSMWorld::InfoCollection::load (const Info& record, bool base) record2.mState = base ? RecordBase::State_BaseOnly : RecordBase::State_ModifiedOnly; (base ? record2.mBase : record2.mModified) = record; - appendRecord (record2); + insertRecord (record2, getIdMap().size()); } else { @@ -33,6 +35,27 @@ void CSMWorld::InfoCollection::load (const Info& record, bool base) } } +int CSMWorld::InfoCollection::getAppendIndex (const std::string& id, UniversalId::Type type) const +{ + std::string::size_type separator = id.find_last_of ('#'); + + if (separator==std::string::npos) + throw std::runtime_error ("invalid info ID: " + id); + + std::pair range = getTopicRange (id.substr (0, separator)); + + if (range.first==range.second) + return Collection >::getAppendIndex (id, type); + + int index = 0; + + for (; range.first!=range.second; ++range.first) + if (range.first->second>index) + index = range.first->second; + + return index+1; +} + void CSMWorld::InfoCollection::load (ESM::ESMReader& reader, bool base, const ESM::Dialogue& dialogue) { /// \todo put records into proper order @@ -85,14 +108,14 @@ std::pairsecond).get().mTopicId==topic) + if (Misc::StringUtils::lowerCase (getRecord (begin->second).get().mTopicId)==topic2) break; // Find end MapConstIterator end = begin; for (; end!=getIdMap().end(); ++end) - if (getRecord (end->second).get().mTopicId!=topic) + if (Misc::StringUtils::lowerCase (getRecord (end->second).get().mTopicId)!=topic2) break; return std::make_pair (begin, end); diff --git a/apps/opencs/model/world/infocollection.hpp b/apps/opencs/model/world/infocollection.hpp index f92e63e81d..8ca5f3b45e 100644 --- a/apps/opencs/model/world/infocollection.hpp +++ b/apps/opencs/model/world/infocollection.hpp @@ -23,6 +23,10 @@ namespace CSMWorld public: + virtual int getAppendIndex (const std::string& id, + UniversalId::Type type = UniversalId::Type_None) const; + ///< \param type Will be ignored, unless the collection supports multiple record types + void load (ESM::ESMReader& reader, bool base, const ESM::Dialogue& dialogue); std::pair getTopicRange (const std::string& topic)