mirror of
https://github.com/OpenMW/openmw.git
synced 2025-07-04 05:41:36 +00:00
Allow OpenMW 0.48 to parse save headers from 0.49
This commit is contained in:
parent
4132d14954
commit
d9bdd9b301
4 changed files with 47 additions and 2 deletions
|
@ -62,6 +62,44 @@ void ESMReader::clearCtx()
|
||||||
mCtx.subName.clear();
|
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)
|
void ESMReader::resolveParentFileIndices(ReadersCache& readers)
|
||||||
{
|
{
|
||||||
mCtx.parentFileIndices.clear();
|
mCtx.parentFileIndices.clear();
|
||||||
|
|
|
@ -43,6 +43,9 @@ public:
|
||||||
const std::string& getName() const { return mCtx.filename; };
|
const std::string& getName() const { return mCtx.filename; };
|
||||||
bool isOpen() const { return mEsm != nullptr; }
|
bool isOpen() const { return mEsm != nullptr; }
|
||||||
|
|
||||||
|
std::string getMaybeFixedStringSize(std::size_t size);
|
||||||
|
std::string_view getStringView(std::size_t size);
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
*
|
*
|
||||||
* Opening and closing
|
* Opening and closing
|
||||||
|
|
|
@ -35,8 +35,8 @@ void Header::load (ESMReader &esm)
|
||||||
esm.getSubHeader();
|
esm.getSubHeader();
|
||||||
esm.getT(mData.version);
|
esm.getT(mData.version);
|
||||||
esm.getT(mData.type);
|
esm.getT(mData.type);
|
||||||
mData.author.assign( esm.getString(32) );
|
mData.author.assign(esm.getMaybeFixedStringSize(32));
|
||||||
mData.desc.assign( esm.getString(256) );
|
mData.desc.assign(esm.getMaybeFixedStringSize(256));
|
||||||
esm.getT(mData.records);
|
esm.getT(mData.records);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,10 @@ void SavedGame::load (ESMReader &esm)
|
||||||
esm.getHNOT (mPlayerLevel, "PLLE");
|
esm.getHNOT (mPlayerLevel, "PLLE");
|
||||||
|
|
||||||
mPlayerClassId = esm.getHNOString("PLCL");
|
mPlayerClassId = esm.getHNOString("PLCL");
|
||||||
|
// Erase RefId type
|
||||||
|
if (esm.getFormat() >= 22 && !mPlayerClassId.empty())
|
||||||
|
mPlayerClassId = mPlayerClassId.substr(1);
|
||||||
|
|
||||||
mPlayerClassName = esm.getHNOString("PLCN");
|
mPlayerClassName = esm.getHNOString("PLCN");
|
||||||
|
|
||||||
mPlayerCell = esm.getHNString("PLCE");
|
mPlayerCell = esm.getHNString("PLCE");
|
||||||
|
|
Loading…
Reference in a new issue