#include "inventorystate.hpp" #include "esmreader.hpp" #include "esmwriter.hpp" namespace { void read (ESM::ESMReader &esm, ESM::ObjectState& state, int& slot) { slot = -1; esm.getHNOT (slot, "SLOT"); state.mRef.loadId(esm, true); state.load (esm); } void write (ESM::ESMWriter &esm, const ESM::ObjectState& state, int slot) { int unused = 0; esm.writeHNT ("IOBJ", unused); if (slot!=-1) esm.writeHNT ("SLOT", slot); state.save (esm, true); } } void ESM::InventoryState::load (ESMReader &esm) { while (esm.isNextSub ("IOBJ")) { int unused; // no longer used esm.getHT(unused); ObjectState state; int slot; read (esm, state, slot); if (state.mCount == 0) continue; mItems.push_back (std::make_pair (state, slot)); } while (esm.isNextSub("LEVM")) { std::string id = esm.getHString(); int count; esm.getHNT (count, "COUN"); mLevelledItemMap[id] = count; } while (esm.isNextSub("MAGI")) { std::string id = esm.getHString(); std::vector > params; while (esm.isNextSub("RAND")) { float rand, multiplier; esm.getHT (rand); esm.getHNT (multiplier, "MULT"); params.push_back(std::make_pair(rand, multiplier)); } mPermanentMagicEffectMagnitudes[id] = params; } } void ESM::InventoryState::save (ESMWriter &esm) const { for (std::vector >::const_iterator iter (mItems.begin()); iter!=mItems.end(); ++iter) write (esm, iter->first, iter->second); for (std::map::const_iterator it = mLevelledItemMap.begin(); it != mLevelledItemMap.end(); ++it) { esm.writeHNString ("LEVM", it->first); esm.writeHNT ("COUN", it->second); } for (TEffectMagnitudes::const_iterator it = mPermanentMagicEffectMagnitudes.begin(); it != mPermanentMagicEffectMagnitudes.end(); ++it) { esm.writeHNString("MAGI", it->first); const std::vector >& params = it->second; for (std::vector >::const_iterator pIt = params.begin(); pIt != params.end(); ++pIt) { esm.writeHNT ("RAND", pIt->first); esm.writeHNT ("MULT", pIt->second); } } }