Skip to content

Commit

Permalink
Add functions to read and write ESM::RefId and use them
Browse files Browse the repository at this point in the history
To be later changed with another implementation.
  • Loading branch information
elsid committed Feb 13, 2023
1 parent bf0da41 commit 6d261d3
Show file tree
Hide file tree
Showing 68 changed files with 273 additions and 191 deletions.
6 changes: 3 additions & 3 deletions apps/essimporter/converter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ namespace ESSImport
public:
void read(ESM::ESMReader& esm) override
{
auto id = ESM::RefId::stringRefId(esm.getHNString("NAME"));
auto id = esm.getHNRefId("NAME");
NPCC npcc;
npcc.load(esm);
if (id == "PlayerSaveGame")
Expand Down Expand Up @@ -308,7 +308,7 @@ namespace ESSImport
{
void read(ESM::ESMReader& esm) override
{
auto id = ESM::RefId::stringRefId(esm.getHNString("NAME"));
auto id = esm.getHNRefId("NAME");
CNTC cntc;
cntc.load(esm);
mContext->mContainerChanges.insert(std::make_pair(std::make_pair(cntc.mIndex, id), cntc));
Expand All @@ -320,7 +320,7 @@ namespace ESSImport
public:
void read(ESM::ESMReader& esm) override
{
auto id = ESM::RefId::stringRefId(esm.getHNString("NAME"));
auto id = esm.getHNRefId("NAME");
CREC crec;
crec.load(esm);
mContext->mCreatureChanges.insert(std::make_pair(std::make_pair(crec.mIndex, id), crec));
Expand Down
2 changes: 1 addition & 1 deletion apps/openmw/mwgui/windowmanagerimp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1815,7 +1815,7 @@ namespace MWGui
if (!mSelectedSpell.empty())
{
writer.startRecord(ESM::REC_ASPL);
writer.writeHNString("ID__", mSelectedSpell.getRefIdString());
writer.writeHNRefId("ID__", mSelectedSpell);
writer.endRecord(ESM::REC_ASPL);
}

Expand Down
2 changes: 1 addition & 1 deletion apps/openmw/mwmechanics/actors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2286,7 +2286,7 @@ namespace MWMechanics
writer.startRecord(ESM::REC_DCOU);
for (const auto& [id, count] : mDeathCount)
{
writer.writeHNString("ID__", id.getRefIdString());
writer.writeHNRefId("ID__", id);
writer.writeHNT("COUN", count);
}
writer.endRecord(ESM::REC_DCOU);
Expand Down
7 changes: 2 additions & 5 deletions components/esm/luascripts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,8 @@ void ESM::LuaScriptsCfg::load(ESMReader& esm)
esm.getSubHeader();
script.mRecords.emplace_back();
ESM::LuaScriptCfg::PerRecordCfg& recordCfg = script.mRecords.back();
std::string recordIdString;
recordIdString.resize(esm.getSubSize() - 1);
recordCfg.mAttach = readBool(esm);
esm.getExact(recordIdString.data(), static_cast<int>(recordIdString.size()));
recordCfg.mRecordId = ESM::RefId::stringRefId(recordIdString);
recordCfg.mRecordId = esm.getRefId(esm.getSubSize() - 1);
recordCfg.mInitializationData = loadLuaBinaryData(esm);
}
while (esm.isNextSub("LUAI"))
Expand Down Expand Up @@ -144,7 +141,7 @@ void ESM::LuaScriptsCfg::save(ESMWriter& esm) const
{
esm.startSubRecord("LUAR");
esm.writeT<char>(recordCfg.mAttach ? 1 : 0);
esm.write(recordCfg.mRecordId.getRefIdString().data(), recordCfg.mRecordId.getRefIdString().size());
esm.writeHRefId(recordCfg.mRecordId);
esm.endRecord("LUAR");
saveLuaBinaryData(esm, recordCfg.mInitializationData);
}
Expand Down
2 changes: 1 addition & 1 deletion components/esm3/activespells.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace ESM
{
for (const auto& params : spells)
{
esm.writeHNString(tag, params.mId.getRefIdString());
esm.writeHNRefId(tag, params.mId);

esm.writeHNT("CAST", params.mCasterActorId);
esm.writeHNString("DISP", params.mDisplayName);
Expand Down
12 changes: 6 additions & 6 deletions components/esm3/aisequence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ namespace ESM
void AiEscort::load(ESMReader& esm)
{
esm.getHNT(mData, "DATA");
mTargetId = ESM::RefId::stringRefId(esm.getHNString("TARG"));
mTargetId = esm.getHNRefId("TARG");
mTargetActorId = -1;
esm.getHNOT(mTargetActorId, "TAID");
esm.getHNT(mRemainingDuration, "DURA");
Expand All @@ -70,7 +70,7 @@ namespace ESM
void AiEscort::save(ESMWriter& esm) const
{
esm.writeHNT("DATA", mData);
esm.writeHNString("TARG", mTargetId.getRefIdString());
esm.writeHNRefId("TARG", mTargetId);
esm.writeHNT("TAID", mTargetActorId);
esm.writeHNT("DURA", mRemainingDuration);
if (!mCellId.empty())
Expand All @@ -82,7 +82,7 @@ namespace ESM
void AiFollow::load(ESMReader& esm)
{
esm.getHNT(mData, "DATA");
mTargetId = ESM::RefId::stringRefId(esm.getHNString("TARG"));
mTargetId = esm.getHNRefId("TARG");
mTargetActorId = -1;
esm.getHNOT(mTargetActorId, "TAID");
esm.getHNT(mRemainingDuration, "DURA");
Expand All @@ -107,7 +107,7 @@ namespace ESM
void AiFollow::save(ESMWriter& esm) const
{
esm.writeHNT("DATA", mData);
esm.writeHNString("TARG", mTargetId.getRefIdString());
esm.writeHNRefId("TARG", mTargetId);
esm.writeHNT("TAID", mTargetActorId);
esm.writeHNT("DURA", mRemainingDuration);
if (!mCellId.empty())
Expand All @@ -122,14 +122,14 @@ namespace ESM

void AiActivate::load(ESMReader& esm)
{
mTargetId = ESM::RefId::stringRefId(esm.getHNString("TARG"));
mTargetId = esm.getHNRefId("TARG");
mRepeat = false;
esm.getHNOT(mRepeat, "REPT");
}

void AiActivate::save(ESMWriter& esm) const
{
esm.writeHNString("TARG", mTargetId.getRefIdString());
esm.writeHNRefId("TARG", mTargetId);
if (mRepeat)
esm.writeHNT("REPT", mRepeat);
}
Expand Down
16 changes: 8 additions & 8 deletions components/esm3/cellref.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ namespace ESM
else
{
RefNum{}.load(esm, wideRefNum);
esm.skipHNOString("NAME");
esm.skipHNORefId("NAME");
}
}

Expand All @@ -45,7 +45,7 @@ namespace ESM
if constexpr (load)
refId = esm.getRefId();
else
esm.skipHString();
esm.skipHRefId();
};

const auto getHStringOrSkip = [&](std::string& value) {
Expand Down Expand Up @@ -195,7 +195,7 @@ namespace ESM
{
mRefNum.save(esm, wideRefNum);

esm.writeHNCString("NAME", mRefID.getRefIdString());
esm.writeHNCRefId("NAME", mRefID);

if (isDeleted)
{
Expand All @@ -209,14 +209,14 @@ namespace ESM
}

if (!inInventory)
esm.writeHNOCString("ANAM", mOwner.getRefIdString());
esm.writeHNOCRefId("ANAM", mOwner);

esm.writeHNOCString("BNAM", mGlobalVariable);
esm.writeHNOCString("XSOL", mSoul.getRefIdString());
esm.writeHNOCRefId("XSOL", mSoul);

if (!inInventory)
{
esm.writeHNOCString("CNAM", mFaction.getRefIdString());
esm.writeHNOCRefId("CNAM", mFaction);
if (mFactionRank != -2)
{
esm.writeHNT("INDX", mFactionRank);
Expand Down Expand Up @@ -245,8 +245,8 @@ namespace ESM

if (!inInventory)
{
esm.writeHNOCString("KNAM", mKey.getRefIdString());
esm.writeHNOCString("TNAM", mTrap.getRefIdString());
esm.writeHNOCRefId("KNAM", mKey);
esm.writeHNOCRefId("TNAM", mTrap);
}

if (mReferenceBlocked != -1)
Expand Down
10 changes: 5 additions & 5 deletions components/esm3/creaturestats.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,9 @@ namespace ESM
mFallHeight = 0;
esm.getHNOT(mFallHeight, "FALL");

mLastHitObject = ESM::RefId::stringRefId(esm.getHNOString("LHIT"));
mLastHitObject = esm.getHNORefId("LHIT");

mLastHitAttemptObject = ESM::RefId::stringRefId(esm.getHNOString("LHAT"));
mLastHitAttemptObject = esm.getHNORefId("LHAT");

if (esm.getFormatVersion() <= MaxWerewolfDeprecatedDataFormatVersion)
esm.getHNOT(mRecalcDynamicStats, "CALC");
Expand Down Expand Up @@ -121,7 +121,7 @@ namespace ESM
{
int magicEffect;
esm.getHT(magicEffect);
ESM::RefId source = ESM::RefId::stringRefId(esm.getHNOString("SOUR"));
ESM::RefId source = esm.getHNORefId("SOUR");
int effectIndex = -1;
esm.getHNOT(effectIndex, "EIND");
int actorId;
Expand Down Expand Up @@ -229,10 +229,10 @@ namespace ESM
esm.writeHNT("FALL", mFallHeight);

if (!mLastHitObject.empty())
esm.writeHNString("LHIT", mLastHitObject.getRefIdString());
esm.writeHNRefId("LHIT", mLastHitObject);

if (!mLastHitAttemptObject.empty())
esm.writeHNString("LHAT", mLastHitAttemptObject.getRefIdString());
esm.writeHNRefId("LHAT", mLastHitAttemptObject);

if (mDrawState)
esm.writeHNT("DRAW", mDrawState);
Expand Down
2 changes: 1 addition & 1 deletion components/esm3/debugprofile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ namespace ESM

void DebugProfile::save(ESMWriter& esm, bool isDeleted) const
{
esm.writeHNCString("NAME", mId.getRefIdString());
esm.writeHNCRefId("NAME", mId);

if (isDeleted)
{
Expand Down
6 changes: 3 additions & 3 deletions components/esm3/dialoguestate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,16 @@ namespace ESM
{
for (auto iter(mKnownTopics.begin()); iter != mKnownTopics.end(); ++iter)
{
esm.writeHNString("TOPI", iter->getRefIdString());
esm.writeHNRefId("TOPI", *iter);
}

for (auto iter = mChangedFactionReaction.begin(); iter != mChangedFactionReaction.end(); ++iter)
{
esm.writeHNString("FACT", iter->first.getRefIdString());
esm.writeHNRefId("FACT", iter->first);

for (auto reactIter = iter->second.begin(); reactIter != iter->second.end(); ++reactIter)
{
esm.writeHNString("REA2", reactIter->first.getRefIdString());
esm.writeHNRefId("REA2", reactIter->first);
esm.writeHNT("INTV", reactIter->second);
}
}
Expand Down
20 changes: 18 additions & 2 deletions components/esm3/esmreader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,10 @@ namespace ESM
return ESM::RefId::sEmpty;
}

void ESMReader::skipHNOString(NAME name)
void ESMReader::skipHNORefId(NAME name)
{
if (isNextSub(name))
skipHString();
skipHRefId();
}

std::string ESMReader::getHNString(NAME name)
Expand All @@ -143,6 +143,12 @@ namespace ESM
return getHString();
}

RefId ESMReader::getHNRefId(NAME name)
{
getSubNameIs(name);
return getRefId();
}

std::string ESMReader::getHString()
{
return std::string(getHStringView());
Expand Down Expand Up @@ -194,6 +200,11 @@ namespace ESM
skip(mCtx.leftSub);
}

void ESMReader::skipHRefId()
{
skipHString();
}

void ESMReader::getHExact(void* p, int size)
{
getSubHeader();
Expand Down Expand Up @@ -390,6 +401,11 @@ namespace ESM
return std::string_view(ptr, size);
}

RefId ESMReader::getRefId(std::size_t size)
{
return RefId::stringRefId(getStringView(size));
}

[[noreturn]] void ESMReader::fail(const std::string& msg)
{
std::stringstream ss;
Expand Down
13 changes: 12 additions & 1 deletion components/esm3/esmreader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,20 +165,27 @@ namespace ESM

// Read a string by the given name if it is the next record.
std::string getHNOString(NAME name);

ESM::RefId getHNORefId(NAME name);

void skipHNOString(NAME name);
void skipHNORefId(NAME name);

// Read a string with the given sub-record name
std::string getHNString(NAME name);

RefId getHNRefId(NAME name);

// Read a string, including the sub-record header (but not the name)
std::string getHString();

std::string_view getHStringView();

RefId getRefId();

void skipHString();

void skipHRefId();

// Read the given number of bytes from a subrecord
void getHExact(void* p, int size);

Expand Down Expand Up @@ -272,10 +279,14 @@ namespace ESM

std::string getMaybeFixedStringSize(std::size_t size);

RefId getMaybeFixedRefIdSize(std::size_t size) { return RefId::stringRefId(getMaybeFixedStringSize(size)); }

// Read the next 'size' bytes and return them as a string. Converts
// them from native encoding to UTF8 in the process.
std::string_view getStringView(std::size_t size);

RefId getRefId(std::size_t size);

void skip(std::size_t bytes)
{
char buffer[4096];
Expand Down
25 changes: 25 additions & 0 deletions components/esm3/esmwriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,16 @@ namespace ESM
endRecord(name);
}

void ESMWriter::writeHNRefId(NAME name, const RefId& value)
{
writeHNString(name, value.getRefIdString());
}

void ESMWriter::writeHNRefId(NAME name, const RefId& value, std::size_t size)
{
writeHNString(name, value.getRefIdString(), size);
}

void ESMWriter::writeMaybeFixedSizeString(const std::string& data, std::size_t size)
{
std::string string;
Expand Down Expand Up @@ -210,6 +220,21 @@ namespace ESM
write("\0", 1);
}

void ESMWriter::writeMaybeFixedSizeRefId(const RefId& value, std::size_t size)
{
writeMaybeFixedSizeString(value.getRefIdString(), size);
}

void ESMWriter::writeHRefId(const RefId& value)
{
writeHString(value.getRefIdString());
}

void ESMWriter::writeHCRefId(const RefId& value)
{
writeHCString(value.getRefIdString());
}

void ESMWriter::writeName(NAME name)
{
write(name.mData, NAME::sCapacity);
Expand Down
Loading

0 comments on commit 6d261d3

Please sign in to comment.