forked from mirror/openmw-tes3mp
72 lines
1.7 KiB
C++
72 lines
1.7 KiB
C++
|
|
#include "refcollection.hpp"
|
|
|
|
#include <sstream>
|
|
|
|
#include <components/misc/stringops.hpp>
|
|
|
|
#include "ref.hpp"
|
|
#include "cell.hpp"
|
|
#include "universalid.hpp"
|
|
#include "record.hpp"
|
|
|
|
void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool base,
|
|
std::map<ESM::CellRef::RefNum, std::string>& cache)
|
|
{
|
|
Record<Cell> cell = mCells.getRecord (cellIndex);
|
|
|
|
Cell& cell2 = base ? cell.mBase : cell.mModified;
|
|
|
|
CellRef ref;
|
|
|
|
bool deleted = false;
|
|
|
|
while (ESM::Cell::getNextRef (reader, ref, deleted))
|
|
{
|
|
ref.mCell = cell2.mId;
|
|
|
|
/// \todo handle moved references
|
|
|
|
if (deleted)
|
|
{
|
|
/// \todo handle deleted references
|
|
continue;
|
|
}
|
|
|
|
std::map<ESM::CellRef::RefNum, std::string>::iterator iter = cache.find (ref.mRefNum);
|
|
|
|
if (iter==cache.end())
|
|
{
|
|
// new reference
|
|
ref.mId = getNewId();
|
|
|
|
Record<CellRef> record;
|
|
record.mState = base ? RecordBase::State_BaseOnly : RecordBase::State_ModifiedOnly;
|
|
(base ? record.mBase : record.mModified) = ref;
|
|
|
|
appendRecord (record);
|
|
|
|
cache.insert (std::make_pair (ref.mRefNum, ref.mId));
|
|
}
|
|
else
|
|
{
|
|
// old reference -> merge
|
|
ref.mId = iter->second;
|
|
|
|
int index = getIndex (ref.mId);
|
|
|
|
Record<CellRef> record = getRecord (index);
|
|
record.mState = base ? RecordBase::State_BaseOnly : RecordBase::State_Modified;
|
|
(base ? record.mBase : record.mModified) = ref;
|
|
|
|
setRecord (index, record);
|
|
}
|
|
}
|
|
}
|
|
|
|
std::string CSMWorld::RefCollection::getNewId()
|
|
{
|
|
std::ostringstream stream;
|
|
stream << "ref#" << mNextId++;
|
|
return stream.str();
|
|
}
|