1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-06 16:15:33 +00:00

More ESM records have DELE handling.

Changed records: Race, Land, Pathgrid, StartScript, DebugProfile, Filter
This commit is contained in:
Stanislav Bas 2015-07-16 22:17:49 +03:00
parent ad353e6dd0
commit e65ff723ce
12 changed files with 504 additions and 307 deletions

View file

@ -7,17 +7,53 @@
unsigned int ESM::DebugProfile::sRecordId = REC_DBGP;
ESM::DebugProfile::DebugProfile()
: mIsDeleted(false)
{}
void ESM::DebugProfile::load (ESMReader& esm)
{
mId = esm.getHNString ("NAME");
mDescription = esm.getHNString ("DESC");
mScriptText = esm.getHNString ("SCRP");
esm.getHNT (mFlags, "FLAG");
mIsDeleted = false;
while (esm.hasMoreSubs())
{
esm.getSubName();
uint32_t name = esm.retSubName().val;
switch (name)
{
case ESM::FourCC<'N','A','M','E'>::value:
mId = esm.getHString();
break;
case ESM::FourCC<'D','E','L','E'>::value:
esm.skipHSub();
mIsDeleted = true;
break;
case ESM::FourCC<'D','E','S','C'>::value:
mDescription = esm.getHString();
break;
case ESM::FourCC<'S','C','R','P'>::value:
mScriptText = esm.getHString();
break;
case ESM::FourCC<'F','L','A','G'>::value:
esm.getHT(mFlags);
break;
default:
esm.fail("Unknown subrecord");
break;
}
}
}
void ESM::DebugProfile::save (ESMWriter& esm) const
{
esm.writeHNCString ("NAME", mId);
if (mIsDeleted)
{
esm.writeHNCString("DELE", "");
return;
}
esm.writeHNCString ("DESC", mDescription);
esm.writeHNCString ("SCRP", mScriptText);
esm.writeHNT ("FLAG", mFlags);
@ -28,4 +64,5 @@ void ESM::DebugProfile::blank()
mDescription.clear();
mScriptText.clear();
mFlags = 0;
mIsDeleted = false;
}

View file

@ -27,6 +27,10 @@ namespace ESM
unsigned int mFlags;
bool mIsDeleted;
DebugProfile();
void load (ESMReader& esm);
void save (ESMWriter& esm) const;

View file

@ -7,16 +7,50 @@
unsigned int ESM::Filter::sRecordId = REC_FILT;
ESM::Filter::Filter()
: mIsDeleted(false)
{}
void ESM::Filter::load (ESMReader& esm)
{
mId = esm.getHNString ("NAME");
mFilter = esm.getHNString ("FILT");
mDescription = esm.getHNString ("DESC");
mIsDeleted = false;
while (esm.hasMoreSubs())
{
esm.getSubName();
uint32_t name = esm.retSubName().val;
switch (name)
{
case ESM::FourCC<'N','A','M','E'>::value:
mId = esm.getHString();
break;
case ESM::FourCC<'D','E','L','E'>::value:
esm.skipHSub();
mIsDeleted = true;
break;
case ESM::FourCC<'F','I','L','T'>::value:
mFilter = esm.getHString();
break;
case ESM::FourCC<'D','E','S','C'>::value:
mDescription = esm.getHString();
break;
default:
esm.fail("Unknown subrecord");
break;
}
}
}
void ESM::Filter::save (ESMWriter& esm) const
{
esm.writeHNCString ("NAME", mId);
if (mIsDeleted)
{
esm.writeHNCString("DELE", "");
return;
}
esm.writeHNCString ("FILT", mFilter);
esm.writeHNCString ("DESC", mDescription);
}
@ -25,4 +59,5 @@ void ESM::Filter::blank()
{
mFilter.clear();
mDescription.clear();
mIsDeleted = false;
}

View file

@ -18,6 +18,10 @@ namespace ESM
std::string mFilter;
bool mIsDeleted;
Filter();
void load (ESMReader& esm);
void save (ESMWriter& esm) const;

View file

@ -72,6 +72,7 @@ Land::Land()
, mDataTypes(0)
, mDataLoaded(false)
, mLandData(NULL)
, mIsDeleted(false)
{
}
@ -84,6 +85,7 @@ void Land::load(ESMReader &esm)
{
mEsm = &esm;
mPlugin = mEsm->getIndex();
mIsDeleted = false;
// Get the grid location
esm.getSubNameIs("INTV");
@ -93,6 +95,12 @@ void Land::load(ESMReader &esm)
esm.getHNT(mFlags, "DATA");
if (esm.isNextSub("DELE"))
{
esm.skipHSub();
mIsDeleted = true;
}
// Store the file position
mContext = esm.getContext();
@ -135,6 +143,21 @@ void Land::save(ESMWriter &esm) const
esm.endRecord("INTV");
esm.writeHNT("DATA", mFlags);
if (mIsDeleted)
{
esm.writeHNCString("DELE", "");
}
if (mLandData != NULL)
{
mLandData->save(esm);
}
}
void Land::blank()
{
mIsDeleted = false;
}
void Land::loadData(int flags)

View file

@ -97,10 +97,12 @@ struct Land
LandData *mLandData;
bool mIsDeleted;
void load(ESMReader &esm);
void save(ESMWriter &esm) const;
void blank() {}
void blank();
/**
* Actually loads data

View file

@ -32,18 +32,35 @@ namespace ESM
{
}
Pathgrid::Pathgrid()
: mIsDeleted(false)
{}
void Pathgrid::load(ESMReader &esm)
{
esm.getHNT(mData, "DATA", 12);
mCell = esm.getHNString("NAME");
mPoints.clear();
mEdges.clear();
// keep track of total connections so we can reserve edge vector size
int edgeCount = 0;
if (esm.isNextSub("PGRP"))
bool hasData = false;
bool hasName = false;
while (esm.hasMoreSubs())
{
esm.getSubName();
uint32_t name = esm.retSubName().val;
switch (name)
{
case ESM::FourCC<'D','A','T','A'>::value:
esm.getHT(mData, 12);
hasData = true;
break;
case ESM::FourCC<'N','A','M','E'>::value:
mCell = esm.getHString();
hasName = true;
break;
case ESM::FourCC<'P','G','R','P'>::value:
{
esm.getSubHeader();
int size = esm.getSubSize();
@ -62,9 +79,9 @@ void Pathgrid::load(ESMReader &esm)
edgeCount += p.mConnectionNum;
}
}
break;
}
if (esm.isNextSub("PGRC"))
case ESM::FourCC<'P','G','R','C'>::value:
{
esm.getSubHeader();
int size = esm.getSubSize();
@ -97,13 +114,35 @@ void Pathgrid::load(ESMReader &esm)
}
}
}
break;
}
case ESM::FourCC<'D','E','L','E'>::value:
esm.skipHSub();
mIsDeleted = true;
break;
default:
esm.fail("Unknown subrecord");
break;
}
}
if (!hasData)
esm.fail("Missing DATA subrecord");
if (!hasName)
esm.fail("Missing NAME subrecord");
}
void Pathgrid::save(ESMWriter &esm) const
{
esm.writeHNT("DATA", mData, 12);
esm.writeHNCString("NAME", mCell);
if (mIsDeleted)
{
esm.writeHNCString("DELE", "");
return;
}
if (!mPoints.empty())
{
esm.startSubRecord("PGRP");
@ -134,5 +173,6 @@ void Pathgrid::save(ESMWriter &esm) const
mData.mS2 = 0;
mPoints.clear();
mEdges.clear();
mIsDeleted = false;
}
}

View file

@ -53,6 +53,10 @@ struct Pathgrid
typedef std::vector<Edge> EdgeList;
EdgeList mEdges;
bool mIsDeleted;
Pathgrid();
void load(ESMReader &esm);
void save(ESMWriter &esm) const;

View file

@ -8,6 +8,10 @@ namespace ESM
{
unsigned int Race::sRecordId = REC_RACE;
Race::Race()
: mIsDeleted(false)
{}
int Race::MaleFemale::getValue (bool male) const
{
return male ? mMale : mFemale;
@ -21,9 +25,9 @@ namespace ESM
void Race::load(ESMReader &esm)
{
mPowers.mList.clear();
mIsDeleted = false;
mId = esm.getHNString("NAME");
bool hasName = false;
bool hasData = false;
while (esm.hasMoreSubs())
{
@ -31,6 +35,14 @@ void Race::load(ESMReader &esm)
uint32_t name = esm.retSubName().val;
switch (name)
{
case ESM::FourCC<'N','A','M','E'>::value:
mId = esm.getHString();
hasName = true;
break;
case ESM::FourCC<'D','E','L','E'>::value:
esm.skipHSub();
mIsDeleted = true;
break;
case ESM::FourCC<'F','N','A','M'>::value:
mName = esm.getHString();
break;
@ -48,12 +60,22 @@ void Race::load(ESMReader &esm)
esm.fail("Unknown subrecord");
}
}
if (!hasData)
if (!hasName)
esm.fail("Missing NAME subrecord");
if (!hasData && !mIsDeleted)
esm.fail("Missing RADT subrecord");
}
void Race::save(ESMWriter &esm) const
{
esm.writeHNCString("NAME", mId);
if (mIsDeleted)
{
esm.writeHNCString("DELE", "");
return;
}
esm.writeHNOCString("FNAM", mName);
esm.writeHNT("RADT", mData, 140);
mPowers.save(esm);

View file

@ -68,6 +68,10 @@ struct Race
std::string mId, mName, mDescription;
SpellList mPowers;
bool mIsDeleted;
Race();
void load(ESMReader &esm);
void save(ESMWriter &esm) const;

View file

@ -8,8 +8,14 @@ namespace ESM
{
unsigned int StartScript::sRecordId = REC_SSCR;
StartScript::StartScript()
: mIsDeleted(false)
{}
void StartScript::load(ESMReader &esm)
{
mIsDeleted = false;
bool hasData = false;
bool hasName = false;
while (esm.hasMoreSubs())
@ -26,10 +32,16 @@ namespace ESM
mId = esm.getHString();
hasName = true;
break;
case ESM::FourCC<'D','E','L','E'>::value:
esm.skipHSub();
mIsDeleted = true;
break;
default:
esm.fail("Unknown subrecord");
break;
}
}
if (!hasData)
esm.fail("Missing DATA");
if (!hasName)
@ -39,10 +51,16 @@ namespace ESM
{
esm.writeHNString("DATA", mData);
esm.writeHNString("NAME", mId);
if (mIsDeleted)
{
esm.writeHNCString("DELE", "");
}
}
void StartScript::blank()
{
mData.clear();
mIsDeleted = false;
}
}

View file

@ -26,6 +26,10 @@ struct StartScript
std::string mData;
std::string mId;
bool mIsDeleted;
StartScript();
// Load a record and add it to the list
void load(ESMReader &esm);
void save(ESMWriter &esm) const;