Allow OpenMW 0.48 to parse save headers from 0.49

openmw-48
Andrei Kortunov 11 months ago
parent 4132d14954
commit d9bdd9b301

@ -62,6 +62,44 @@ void ESMReader::clearCtx()
mCtx.subName.clear();
}
std::string ESMReader::getMaybeFixedStringSize(std::size_t size)
{
if (mHeader.mFormat > 22)
{
std::uint32_t storedSize = 0;
getT(storedSize);
if (storedSize > mCtx.leftSub)
fail("String does not fit subrecord (" + std::to_string(storedSize) + " > "
+ std::to_string(mCtx.leftSub) + ")");
size = static_cast<std::size_t>(storedSize);
}
return std::string(getStringView(size));
}
std::string_view ESMReader::getStringView(std::size_t size)
{
if (mBuffer.size() <= size)
// Add some extra padding to reduce the chance of having to resize
// again later.
mBuffer.resize(3 * size);
// And make sure the string is zero terminated
mBuffer[size] = 0;
// read ESM data
char* ptr = mBuffer.data();
getExact(ptr, size);
size = strnlen(ptr, size);
// Convert to UTF8 and return
if (mEncoder != nullptr)
return mEncoder->getUtf8(std::string_view(ptr, size));
return std::string_view(ptr, size);
}
void ESMReader::resolveParentFileIndices(ReadersCache& readers)
{
mCtx.parentFileIndices.clear();

@ -43,6 +43,9 @@ public:
const std::string& getName() const { return mCtx.filename; };
bool isOpen() const { return mEsm != nullptr; }
std::string getMaybeFixedStringSize(std::size_t size);
std::string_view getStringView(std::size_t size);
/*************************************************************************
*
* Opening and closing

@ -35,8 +35,8 @@ void Header::load (ESMReader &esm)
esm.getSubHeader();
esm.getT(mData.version);
esm.getT(mData.type);
mData.author.assign( esm.getString(32) );
mData.desc.assign( esm.getString(256) );
mData.author.assign(esm.getMaybeFixedStringSize(32));
mData.desc.assign(esm.getMaybeFixedStringSize(256));
esm.getT(mData.records);
}

@ -14,6 +14,10 @@ void SavedGame::load (ESMReader &esm)
esm.getHNOT (mPlayerLevel, "PLLE");
mPlayerClassId = esm.getHNOString("PLCL");
// Erase RefId type
if (esm.getFormat() >= 22 && !mPlayerClassId.empty())
mPlayerClassId = mPlayerClassId.substr(1);
mPlayerClassName = esm.getHNOString("PLCN");
mPlayerCell = esm.getHNString("PLCE");

Loading…
Cancel
Save