void Region::load(ESMReader &esm) { mName = esm.getHNString("FNAM"); if (esm.getVer() == VER_12) esm.getHNExact(&mData, sizeof(mData) - 2, "WEAT"); else if (esm.getVer() == VER_13) esm.getHNExact(&mData, sizeof(mData), "WEAT"); else esm.fail("Don't know what to do in this version"); mSleepList = esm.getHNOString("BNAM"); esm.getHNT(mMapColor, "CNAM"); while (esm.hasMoreSubs()) { SoundRef sr; esm.getHNT(sr, "SNAM", 33); mSoundList.push_back(sr); } }
void Script::load(ESMReader &esm) { SCHD data; esm.getHNT(data, "SCHD", 52); mData = data.mData; mId = data.mName.toString(); // List of local variables if (esm.isNextSub("SCVR")) { int s = mData.mStringTableSize; char* tmp = new char[s]; esm.getHExact(tmp, s); // Set up the list of variable names mVarNames.resize(mData.mNumShorts + mData.mNumLongs + mData.mNumFloats); // The tmp buffer is a null-byte separated string list, we // just have to pick out one string at a time. char* str = tmp; for (size_t i = 0; i < mVarNames.size(); i++) { mVarNames[i] = std::string(str); str += mVarNames[i].size() + 1; if (str - tmp > s) esm.fail("String table overflow"); } delete[] tmp; } // Script mData mScriptData.resize(mData.mScriptDataSize); esm.getHNExact(&mScriptData[0], mScriptData.size(), "SCDT"); // Script text mScriptText = esm.getHNOString("SCTX"); }
void Script::load(ESMReader &esm) { SCHD data; esm.getHNT(data, "SCHD", 52); mData = data.mData; mId = data.mName.toString(); // List of local variables if (esm.isNextSub("SCVR")) { int s = mData.mStringTableSize; std::vector<char> tmp (s); esm.getHExact (&tmp[0], s); // Set up the list of variable names mVarNames.resize(mData.mNumShorts + mData.mNumLongs + mData.mNumFloats); // The tmp buffer is a null-byte separated string list, we // just have to pick out one string at a time. char* str = &tmp[0]; for (size_t i = 0; i < mVarNames.size(); i++) { // Support '\r' terminated strings like vanilla. See Bug #1324. char *termsym = strchr(str, '\r'); if(termsym) *termsym = '\0'; mVarNames[i] = std::string(str); str += mVarNames[i].size() + 1; if (str - &tmp[0] > s) { // Apparently SCVR subrecord is not used and variable names are // determined on the fly from the script text. Therefore don't throw // an exeption, just log an error and continue. std::stringstream ss; ss << "ESM Error: " << "String table overflow"; ss << "\n File: " << esm.getName(); ss << "\n Record: " << esm.getContext().recName.toString(); ss << "\n Subrecord: " << "SCVR"; ss << "\n Offset: 0x" << std::hex << esm.getFileOffset(); std::cerr << ss.str() << std::endl; break; } } } // Script mData mScriptData.resize(mData.mScriptDataSize); esm.getHNExact(&mScriptData[0], mScriptData.size(), "SCDT"); // Script text mScriptText = esm.getHNOString("SCTX"); // NOTE: A minor hack/workaround... // // MAO_Containers.esp from Morrowind Acoustic Overhaul has SCVR records // at the end (see Bug #1849). Since OpenMW does not use SCVR subrecords // for variable names just skip these as a quick fix. An alternative // solution would be to decode and validate SCVR subrecords even if they // appear here. if (esm.isNextSub("SCVR")) { esm.skipHSub(); } }