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()); 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 // Note: We do not need to send update signals here, because at this point the model is not connected
// to any view. // to any view.
while (reader.hasMoreRecs()) while (reader.hasMoreRecs())
@ -516,10 +518,15 @@ void CSMWorld::Data::loadFile (const boost::filesystem::path& path, bool base)
if (record.mType==ESM::Dialogue::Journal) if (record.mType==ESM::Dialogue::Journal)
{ {
int index = mJournals.getAppendIndex (id);
mJournals.load (record, base); mJournals.load (record, base);
dialogue = &mJournals.getRecord (index).get();
} }
else if (record.mType==ESM::Dialogue::Deleted) 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)) if (mJournals.tryDelete (id))
{ {
/// \todo handle info records /// \todo handle info records
@ -535,7 +542,9 @@ void CSMWorld::Data::loadFile (const boost::filesystem::path& path, bool base)
} }
else else
{ {
int index = mTopics.getAppendIndex (id);
mTopics.load (record, base); mTopics.load (record, base);
dialogue = &mTopics.getRecord (index).get();
} }
break; break;
@ -543,14 +552,25 @@ void CSMWorld::Data::loadFile (const boost::filesystem::path& path, bool base)
case ESM::REC_INFO: case ESM::REC_INFO:
{ {
/// \todo associate info record with last loaded dialogue record if (!dialogue)
mJournalInfos.load (reader, base); {
/// \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; break;
} }
default: default:
/// \todo throw an exception instead, once all records are implemented /// \todo throw an exception instead, once all records are implemented
/// or maybe report error and continue?
reader.skipRecord(); 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 put records into proper order
/// \todo adjust ID /// \todo adjust ID

View file

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