split info records between journal and topic info tables

This commit is contained in:
Marc Zinnschlag 2013-10-31 12:16:45 +01:00
parent ba88c94d58
commit 69f28ee4be
3 changed files with 29 additions and 4 deletions

View file

@ -456,6 +456,8 @@ void CSMWorld::Data::loadFile (const boost::filesystem::path& path, bool base)
reader.open (path.string());
const ESM::Dialogue *dialogue = 0;
// Note: We do not need to send update signals here, because at this point the model is not connected
// to any view.
while (reader.hasMoreRecs())
@ -516,10 +518,15 @@ void CSMWorld::Data::loadFile (const boost::filesystem::path& path, bool base)
if (record.mType==ESM::Dialogue::Journal)
{
int index = mJournals.getAppendIndex (id);
mJournals.load (record, base);
dialogue = &mJournals.getRecord (index).get();
}
else if (record.mType==ESM::Dialogue::Deleted)
{
dialogue = 0; // record vector can be shuffled around which would make pointer
// to record invalid
if (mJournals.tryDelete (id))
{
/// \todo handle info records
@ -535,7 +542,9 @@ void CSMWorld::Data::loadFile (const boost::filesystem::path& path, bool base)
}
else
{
int index = mTopics.getAppendIndex (id);
mTopics.load (record, base);
dialogue = &mTopics.getRecord (index).get();
}
break;
@ -543,14 +552,25 @@ void CSMWorld::Data::loadFile (const boost::filesystem::path& path, bool base)
case ESM::REC_INFO:
{
/// \todo associate info record with last loaded dialogue record
mJournalInfos.load (reader, base);
if (!dialogue)
{
/// \todo INFO record without matching DIAL record -> report to user
reader.skipRecord();
break;
}
if (dialogue->mType==ESM::Dialogue::Journal)
mJournalInfos.load (reader, base, *dialogue);
else
mTopicInfos.load (reader, base, *dialogue);
break;
}
default:
/// \todo throw an exception instead, once all records are implemented
/// or maybe report error and continue?
reader.skipRecord();
}
}

View file

@ -30,7 +30,7 @@ void CSMWorld::InfoCollection::load (const ESM::DialInfo& record, bool base)
}
}
void CSMWorld::InfoCollection::load (ESM::ESMReader& reader, bool base)
void CSMWorld::InfoCollection::load (ESM::ESMReader& reader, bool base, const ESM::Dialogue& dialogue)
{
/// \todo put records into proper order
/// \todo adjust ID

View file

@ -5,6 +5,11 @@
#include "collection.hpp"
namespace ESM
{
class Dialogue;
}
namespace CSMWorld
{
class InfoCollection : public Collection<ESM::DialInfo, IdAccessor<ESM::DialInfo> >
@ -13,7 +18,7 @@ namespace CSMWorld
public:
void load (ESM::ESMReader& reader, bool base);
void load (ESM::ESMReader& reader, bool base, const ESM::Dialogue& dialogue);
};
}