mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-10 12:39:53 +00:00
take2 resolve
This commit is contained in:
parent
83ebaf27cc
commit
58a16dacbe
@ -91,11 +91,6 @@ namespace MWClass
|
||||
return ptr.get<ESM::Light>()->mBase->mData.mFlags & ESM::Light::Carry;
|
||||
}
|
||||
|
||||
bool Light::isLight(const MWWorld::ConstPtr& ptr) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
std::unique_ptr<MWWorld::Action> Light::activate(const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const
|
||||
{
|
||||
if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
||||
|
@ -38,8 +38,6 @@ namespace MWClass
|
||||
|
||||
bool isItem(const MWWorld::ConstPtr&) const override;
|
||||
|
||||
bool isLight(const MWWorld::ConstPtr&) const override;
|
||||
|
||||
std::unique_ptr<MWWorld::Action> activate(const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const override;
|
||||
///< Generate action for activation
|
||||
|
||||
|
@ -71,10 +71,11 @@ namespace MWLua
|
||||
if (prop == "condition")
|
||||
{
|
||||
MWWorld::Ptr o = mObject.ptr();
|
||||
if (o.getClass().isLight(o))
|
||||
if (o.mRef->getType() == ESM::REC_LIGH)
|
||||
return sol::make_object(context.mLua->sol(), o.getClass().getRemainingUsageTime(o));
|
||||
else if (o.getClass().hasItemHealth(o))
|
||||
return sol::make_object(context.mLua->sol(), o.getClass().getItemHealth(o));
|
||||
return sol::make_object(
|
||||
context.mLua->sol(), o.getClass().getItemHealth(o) + o.getCellRef().getChargeIntRemainder());
|
||||
}
|
||||
|
||||
return sol::lua_nil;
|
||||
@ -84,14 +85,26 @@ namespace MWLua
|
||||
{
|
||||
if (prop == "condition")
|
||||
{
|
||||
double cond = value.as<double>();
|
||||
if (ptr.getClass().isLight(ptr))
|
||||
float cond = LuaUtil::cast<float>(value);
|
||||
if (ptr.mRef->getType() == ESM::REC_LIGH)
|
||||
ptr.getClass().setRemainingUsageTime(ptr, cond);
|
||||
else if (ptr.getClass().hasItemHealth(ptr))
|
||||
ptr.getCellRef().setCharge(std::max(0, static_cast<int>(cond)));
|
||||
else /*ignore or error?*/
|
||||
{
|
||||
const float lastChargeRemainder = ptr.getCellRef().getChargeIntRemainder();
|
||||
// if the value set is less than 0, chargeInt and chargeIntRemainder is set to 0
|
||||
ptr.getCellRef().setChargeIntRemainder(std::max(0.f, std::modf(cond, &cond)));
|
||||
ptr.getCellRef().setCharge(std::max(0.f, cond));
|
||||
// resolve the remaining charge remainder to be subtracted
|
||||
if (lastChargeRemainder < 0)
|
||||
ptr.getCellRef().applyChargeRemainderToBeSubtracted(lastChargeRemainder);
|
||||
}
|
||||
else
|
||||
invalidPropErr(prop, ptr);
|
||||
return;
|
||||
}
|
||||
|
||||
/*ignore or error?*/
|
||||
invalidPropErr(prop, ptr);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ namespace MWLua
|
||||
public:
|
||||
sol::object getCurrent(const Context& context) const
|
||||
{
|
||||
return getValue(context, mObject, &LevelStat::setValue, 0, "current",
|
||||
return getValue(context, mObject, &LevelStat::setValue, std::monostate{}, "current",
|
||||
[](const MWWorld::Ptr& ptr) { return ptr.getClass().getCreatureStats(ptr).getLevel(); });
|
||||
}
|
||||
|
||||
@ -93,7 +93,7 @@ namespace MWLua
|
||||
{
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &LevelStat::setValue, 0, "current" }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &LevelStat::setValue, std::monostate{}, "current" }] = value;
|
||||
}
|
||||
|
||||
sol::object getProgress(const Context& context) const
|
||||
|
@ -188,19 +188,14 @@ namespace MWWorld
|
||||
void CellRef::applyChargeRemainderToBeSubtracted(float chargeRemainder)
|
||||
{
|
||||
auto esm3Visit = [&](ESM::CellRef& cellRef3) {
|
||||
cellRef3.mChargeIntRemainder += std::abs(chargeRemainder);
|
||||
if (cellRef3.mChargeIntRemainder > 1.0f)
|
||||
cellRef3.mChargeIntRemainder -= std::abs(chargeRemainder);
|
||||
if (cellRef3.mChargeIntRemainder <= -1.0f)
|
||||
{
|
||||
float newChargeRemainder = (cellRef3.mChargeIntRemainder - std::floor(cellRef3.mChargeIntRemainder));
|
||||
if (cellRef3.mChargeInt <= static_cast<int>(cellRef3.mChargeIntRemainder))
|
||||
{
|
||||
cellRef3.mChargeInt = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
cellRef3.mChargeInt -= static_cast<int>(cellRef3.mChargeIntRemainder);
|
||||
}
|
||||
float newChargeRemainder = std::modf(cellRef3.mChargeIntRemainder, &cellRef3.mChargeIntRemainder);
|
||||
cellRef3.mChargeInt += static_cast<int>(cellRef3.mChargeIntRemainder);
|
||||
cellRef3.mChargeIntRemainder = newChargeRemainder;
|
||||
if (cellRef3.mChargeInt < 0)
|
||||
cellRef3.mChargeInt = 0;
|
||||
}
|
||||
};
|
||||
std::visit(ESM::VisitOverload{
|
||||
@ -211,6 +206,16 @@ namespace MWWorld
|
||||
mCellRef.mVariant);
|
||||
}
|
||||
|
||||
void CellRef::setChargeIntRemainder(float chargeRemainder)
|
||||
{
|
||||
std::visit(ESM::VisitOverload{
|
||||
[&](ESM4::Reference& /*ref*/) {},
|
||||
[&](ESM4::ActorCharacter&) {},
|
||||
[&](ESM::CellRef& ref) { ref.mChargeIntRemainder = chargeRemainder; },
|
||||
},
|
||||
mCellRef.mVariant);
|
||||
}
|
||||
|
||||
void CellRef::setChargeFloat(float charge)
|
||||
{
|
||||
std::visit(ESM::VisitOverload{
|
||||
|
@ -118,10 +118,23 @@ namespace MWWorld
|
||||
};
|
||||
return std::visit(Visitor(), mCellRef.mVariant);
|
||||
} // Implemented as union with int charge
|
||||
float getChargeIntRemainder() const
|
||||
{
|
||||
struct Visitor
|
||||
{
|
||||
float operator()(const ESM::CellRef& ref) { return ref.mChargeIntRemainder; }
|
||||
float operator()(const ESM4::Reference& /*ref*/) { return 0; }
|
||||
float operator()(const ESM4::ActorCharacter&) { throw std::logic_error("Not applicable"); }
|
||||
};
|
||||
return std::visit(Visitor(), mCellRef.mVariant);
|
||||
}
|
||||
void setCharge(int charge);
|
||||
void setChargeFloat(float charge);
|
||||
void applyChargeRemainderToBeSubtracted(float chargeRemainder); // Stores remainders and applies if > 1
|
||||
|
||||
// Stores fractional part of mChargeInt
|
||||
void setChargeIntRemainder(float chargeRemainder);
|
||||
|
||||
// The NPC that owns this object (and will get angry if you steal it)
|
||||
ESM::RefId getOwner() const
|
||||
{
|
||||
|
@ -332,8 +332,6 @@ namespace MWWorld
|
||||
// True if it is an item that can be picked up.
|
||||
virtual bool isItem(const MWWorld::ConstPtr& ptr) const { return false; }
|
||||
|
||||
virtual bool isLight(const MWWorld::ConstPtr& ptr) const { return false; }
|
||||
|
||||
virtual bool isBipedal(const MWWorld::ConstPtr& ptr) const;
|
||||
virtual bool canFly(const MWWorld::ConstPtr& ptr) const;
|
||||
virtual bool canSwim(const MWWorld::ConstPtr& ptr) const;
|
||||
|
@ -60,7 +60,7 @@ namespace ESM
|
||||
int32_t mChargeInt; // Used by everything except lights
|
||||
float mChargeFloat; // Used only by lights
|
||||
};
|
||||
float mChargeIntRemainder; // Stores amount of charge not subtracted from mChargeInt
|
||||
float mChargeIntRemainder; // Fractional part of mChargeInt
|
||||
|
||||
// Remaining enchantment charge. This could be -1 if the charge was not touched yet (i.e. full).
|
||||
float mEnchantmentCharge;
|
||||
|
Loading…
x
Reference in New Issue
Block a user