Revert "Light charge handling fix"

This reverts commit 5e0428243b.
This commit is contained in:
scrawl 2015-01-23 02:32:38 +01:00
parent fa4718283d
commit b95748d044
14 changed files with 87 additions and 47 deletions

View file

@ -261,7 +261,7 @@ void loadCell(ESM::Cell &cell, ESM::ESMReader &esm, Arguments& info)
std::cout << " Faction: '" << ref.mFaction << "'" << std::endl;
std::cout << " Faction rank: '" << ref.mFactionRank << "'" << std::endl;
std::cout << " Enchantment charge: '" << ref.mEnchantmentCharge << "'\n";
std::cout << " Uses/health: '" << ref.mChargeInt << "'\n";
std::cout << " Uses/health: '" << ref.mCharge << "'\n";
std::cout << " Gold value: '" << ref.mGoldValue << "'\n";
std::cout << " Blocked: '" << static_cast<int>(ref.mReferenceBlocked) << "'" << std::endl;
std::cout << " Deleted: " << deleted << std::endl;

View file

@ -12,10 +12,10 @@ namespace ESSImport
{
ESM::ObjectState objstate;
objstate.blank();
objstate.mRef = *it;
objstate.mRef.mRefID = Misc::StringUtils::lowerCase(it->mId);
objstate.mCount = std::abs(it->mCount); // restocking items have negative count in the savefile
// openmw handles them differently, so no need to set any flags
objstate.mRef.mCharge = it->mCondition;
state.mItems.push_back(std::make_pair(objstate, it->mRelativeEquipmentSlot));
}
}

View file

@ -45,9 +45,9 @@ namespace ESSImport
// for XSOL and XCHG seen so far, but probably others too
item.ESM::CellRef::loadData(esm);
int charge=-1;
esm.getHNOT(charge, "XHLT");
item.mChargeInt = charge;
item.mCondition = -1;
// FIXME: for Lights, this is actually a float
esm.getHNOT(item.mCondition, "XHLT");
}
mItems.push_back(item);

View file

@ -20,6 +20,7 @@ namespace ESSImport
{
std::string mId;
int mCount;
int mCondition;
int mRelativeEquipmentSlot;
};
std::vector<InventoryItem> mItems;

View file

@ -1053,13 +1053,13 @@ namespace CSMWorld
virtual QVariant get (const Record<ESXRecordT>& record) const
{
return record.get().mChargeInt;
return record.get().mCharge;
}
virtual void set (Record<ESXRecordT>& record, const QVariant& data)
{
ESXRecordT record2 = record.get();
record2.mChargeInt = data.toInt();
record2.mCharge = data.toInt();
record.setModified (record2);
}

View file

@ -26,6 +26,27 @@
#include "../mwrender/actors.hpp"
#include "../mwrender/renderinginterface.hpp"
namespace
{
struct LightCustomData : public MWWorld::CustomData
{
float mTime;
///< Time remaining
LightCustomData(MWWorld::Ptr ptr)
{
MWWorld::LiveCellRef<ESM::Light> *ref = ptr.get<ESM::Light>();
mTime = ref->mBase->mData.mTime;
}
///< Constructs this CustomData from the base values for Ptr.
virtual MWWorld::CustomData *clone() const
{
return new LightCustomData (*this);
}
};
}
namespace MWClass
{
std::string Light::getId (const MWWorld::Ptr& ptr) const
@ -198,16 +219,17 @@ namespace MWClass
void Light::setRemainingUsageTime (const MWWorld::Ptr& ptr, float duration) const
{
ptr.getCellRef().setChargeFloat(duration);
ensureCustomData(ptr);
float &timeRemaining = dynamic_cast<LightCustomData&> (*ptr.getRefData().getCustomData()).mTime;
timeRemaining = duration;
}
float Light::getRemainingUsageTime (const MWWorld::Ptr& ptr) const
{
MWWorld::LiveCellRef<ESM::Light> *ref = ptr.get<ESM::Light>();
if (ptr.getCellRef().getCharge() == -1)
return ref->mBase->mData.mTime;
else
return ptr.getCellRef().getChargeFloat();
ensureCustomData(ptr);
return dynamic_cast<LightCustomData&> (*ptr.getRefData().getCustomData()).mTime;
}
MWWorld::Ptr
@ -219,6 +241,12 @@ namespace MWClass
return MWWorld::Ptr(&cell.get<ESM::Light>().insert(*ref), &cell);
}
void Light::ensureCustomData (const MWWorld::Ptr& ptr) const
{
if (!ptr.getRefData().getCustomData())
ptr.getRefData().setCustomData(new LightCustomData(ptr));
}
bool Light::canSell (const MWWorld::Ptr& item, int npcServices) const
{
return npcServices & ESM::NPC::Lights;
@ -254,6 +282,22 @@ namespace MWClass
return std::make_pair(1,"");
}
void Light::readAdditionalState (const MWWorld::Ptr& ptr, const ESM::ObjectState& state)
const
{
ensureCustomData (ptr);
dynamic_cast<LightCustomData&> (*ptr.getRefData().getCustomData()).mTime = state.mTime;
}
void Light::writeAdditionalState (const MWWorld::Ptr& ptr, ESM::ObjectState& state)
const
{
ensureCustomData (ptr);
state.mTime = dynamic_cast<LightCustomData&> (*ptr.getRefData().getCustomData()).mTime;
}
std::string Light::getSound(const MWWorld::Ptr& ptr) const
{
return ptr.get<ESM::Light>()->mBase->mSound;

View file

@ -10,6 +10,8 @@ namespace MWClass
virtual MWWorld::Ptr
copyToCellImpl(const MWWorld::Ptr &ptr, MWWorld::CellStore &cell) const;
void ensureCustomData (const MWWorld::Ptr& ptr) const;
public:
/// Return ID of \a ptr
@ -73,6 +75,14 @@ namespace MWClass
std::pair<int, std::string> canBeEquipped(const MWWorld::Ptr &ptr, const MWWorld::Ptr &npc) const;
virtual void readAdditionalState (const MWWorld::Ptr& ptr, const ESM::ObjectState& state)
const;
///< Read additional state from \a state into \a ptr.
virtual void writeAdditionalState (const MWWorld::Ptr& ptr, ESM::ObjectState& state)
const;
///< Write additional state from \a ptr into \a state.
virtual std::string getSound(const MWWorld::Ptr& ptr) const;
};
}

View file

@ -81,29 +81,15 @@ namespace MWWorld
int CellRef::getCharge() const
{
return mCellRef.mChargeInt;
return mCellRef.mCharge;
}
void CellRef::setCharge(int charge)
{
if (charge != mCellRef.mChargeInt)
if (charge != mCellRef.mCharge)
{
mChanged = true;
mCellRef.mChargeInt = charge;
}
}
float CellRef::getChargeFloat() const
{
return mCellRef.mChargeFloat;
}
void CellRef::setChargeFloat(float charge)
{
if (charge != mCellRef.mChargeFloat)
{
mChanged = true;
mCellRef.mChargeFloat = charge;
mCellRef.mCharge = charge;
}
}

View file

@ -60,11 +60,8 @@ namespace MWWorld
// For weapon or armor, this is the remaining item health.
// For tools (lockpicks, probes, repair hammer) it is the remaining uses.
// If this returns int(-1) it means full health.
int getCharge() const;
float getChargeFloat() const; // Implemented as union with int charge
void setCharge(int charge);
void setChargeFloat(float charge);
// The NPC that owns this object (and will get angry if you steal it)
std::string getOwner() const;

View file

@ -28,7 +28,7 @@ namespace MWWorld
cellRef.mRefID = name;
cellRef.mScale = 1;
cellRef.mFactionRank = 0;
cellRef.mChargeInt = -1;
cellRef.mCharge = -1;
cellRef.mGoldValue = 1;
cellRef.mEnchantmentCharge = -1;
cellRef.mTeleport = false;