Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
4.7 kB · 174 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175#include "objectstate.hpp"
#include <array>#include <sstream>#include <stdexcept>#include <typeinfo>
#include "esmreader.hpp"#include "esmwriter.hpp"
namespace ESM{
void ObjectState::load(ESMReader& esm) { mVersion = esm.getFormatVersion(); mActorIdConverter = esm.mActorIdConverter;
bool isDeleted; mRef.loadData(esm, isDeleted);
mHasLocals = 0; esm.getHNOT(mHasLocals, "HLOC");
if (mHasLocals) mLocals.load(esm);
mLuaScripts.load(esm);
mEnabled = 1; esm.getHNOT(mEnabled, "ENAB");
if (mVersion <= MaxOldCountFormatVersion) { if (mRef.mRefID == "gold_001" || mRef.mRefID == "gold_005" || mRef.mRefID == "gold_010" || mRef.mRefID == "gold_025" || mRef.mRefID == "gold_100") { if (mVersion <= MaxOldGoldValueFormatVersion) mRef.mCount = std::max(1, mRef.mCount); } else mRef.mCount = 1; esm.getHNOT("COUN", mRef.mCount); }
mPosition = mRef.mPos; esm.getOptionalComposite("POS_", mPosition);
mFlags = 0; esm.getHNOT(mFlags, "FLAG");
mAnimationState.load(esm);
// FIXME: assuming "false" as default would make more sense, but also break compatibility with older save files mHasCustomState = true; esm.getHNOT(mHasCustomState, "HCUS"); }
void ObjectState::save(ESMWriter& esm, bool inInventory) const { mRef.save(esm, true, inInventory);
if (mHasLocals) { esm.writeHNT("HLOC", mHasLocals); mLocals.save(esm); }
mLuaScripts.save(esm);
if (!mEnabled && !inInventory) esm.writeHNT("ENAB", mEnabled);
if (!inInventory && mPosition != mRef.mPos) { esm.writeNamedComposite("POS_", mPosition); }
if (mFlags != 0) esm.writeHNT("FLAG", mFlags);
mAnimationState.save(esm);
if (!mHasCustomState) esm.writeHNT("HCUS", false); }
void ObjectState::blank() { mRef.blank(); mHasLocals = 0; mEnabled = false; for (int i = 0; i < 3; ++i) { mPosition.pos[i] = 0; mPosition.rot[i] = 0; } mFlags = 0; mHasCustomState = true; }
const NpcState& ObjectState::asNpcState() const { std::stringstream error; error << "bad cast " << typeid(this).name() << " to NpcState"; throw std::logic_error(error.str()); }
NpcState& ObjectState::asNpcState() { std::stringstream error; error << "bad cast " << typeid(this).name() << " to NpcState"; throw std::logic_error(error.str()); }
const CreatureState& ObjectState::asCreatureState() const { std::stringstream error; error << "bad cast " << typeid(this).name() << " to CreatureState"; throw std::logic_error(error.str()); }
CreatureState& ObjectState::asCreatureState() { std::stringstream error; error << "bad cast " << typeid(this).name() << " to CreatureState"; throw std::logic_error(error.str()); }
const ContainerState& ObjectState::asContainerState() const { std::stringstream error; error << "bad cast " << typeid(this).name() << " to ContainerState"; throw std::logic_error(error.str()); }
ContainerState& ObjectState::asContainerState() { std::stringstream error; error << "bad cast " << typeid(this).name() << " to ContainerState"; throw std::logic_error(error.str()); }
const DoorState& ObjectState::asDoorState() const { std::stringstream error; error << "bad cast " << typeid(this).name() << " to DoorState"; throw std::logic_error(error.str()); }
DoorState& ObjectState::asDoorState() { std::stringstream error; error << "bad cast " << typeid(this).name() << " to DoorState"; throw std::logic_error(error.str()); }
const CreatureLevListState& ObjectState::asCreatureLevListState() const { std::stringstream error; error << "bad cast " << typeid(this).name() << " to CreatureLevListState"; throw std::logic_error(error.str()); }
CreatureLevListState& ObjectState::asCreatureLevListState() { std::stringstream error; error << "bad cast " << typeid(this).name() << " to CreatureLevListState"; throw std::logic_error(error.str()); }
ObjectState::~ObjectState() = default;
}