Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
3.4 kB · 122 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123#include "loadcont.hpp"
#include "esmreader.hpp"#include "esmwriter.hpp"
#include <components/esm/defs.hpp>
namespace ESM{
void InventoryList::add(ESMReader& esm) { esm.getSubHeader(); ContItem ci; esm.getT(ci.mCount); ci.mItem = esm.getMaybeFixedRefIdSize(32); mList.push_back(ci); }
void InventoryList::save(ESMWriter& esm) const { for (std::vector<ContItem>::const_iterator it = mList.begin(); it != mList.end(); ++it) { esm.startSubRecord("NPCO"); esm.writeT(it->mCount); esm.writeMaybeFixedSizeRefId(it->mItem, 32); esm.endRecord("NPCO"); } }
void Container::load(ESMReader& esm, bool& isDeleted) { isDeleted = false; mRecordFlags = esm.getRecordFlags();
mInventory.mList.clear();
bool hasName = false; bool hasWeight = false; bool hasFlags = false; while (esm.hasMoreSubs()) { esm.getSubName(); switch (esm.retSubName().toInt()) { case SREC_NAME: mId = esm.getRefId(); hasName = true; break; case fourCC("MODL"): mModel = esm.getHString(); break; case fourCC("FNAM"): mName = esm.getHString(); break; case fourCC("CNDT"): esm.getHT(mWeight); hasWeight = true; break; case fourCC("FLAG"): esm.getHT(mFlags); if (mFlags & 0xf4) esm.fail("Unknown flags"); if (!(mFlags & 0x8)) esm.fail("Flag 8 not set"); hasFlags = true; break; case fourCC("SCRI"): mScript = esm.getRefId(); break; case fourCC("NPCO"): mInventory.add(esm); break; case SREC_DELE: esm.skipHSub(); isDeleted = true; break; default: esm.fail("Unknown subrecord"); break; } }
if (!hasName) esm.fail("Missing NAME subrecord"); if (!hasWeight && !isDeleted) esm.fail("Missing CNDT subrecord"); if (!hasFlags && !isDeleted) esm.fail("Missing FLAG subrecord"); }
void Container::save(ESMWriter& esm, bool isDeleted) const { esm.writeHNCRefId("NAME", mId);
if (isDeleted) { esm.writeHNString("DELE", "", 3); return; }
esm.writeHNCString("MODL", mModel.getOriginal()); esm.writeHNOCString("FNAM", mName); esm.writeHNT("CNDT", mWeight); esm.writeHNT("FLAG", mFlags);
esm.writeHNOCRefId("SCRI", mScript);
mInventory.save(esm); }
void Container::blank() { mRecordFlags = 0; mName.clear(); mModel.clear(); mScript = ESM::RefId(); mWeight = 0; mFlags = 0x8; // set default flag value mInventory.mList.clear(); }}