Fix incorrect handling of baseDisposition >= 100 in testDisposition(), enable unbounded getDerivedDisposition() (Fixes #3233)

move
ae-g-i-s 9 years ago
parent 0fc65db6bb
commit 000597236e

@ -97,7 +97,7 @@ namespace MWBase
virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying) = 0; virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying) = 0;
///< This is used by every service to determine the price of objects given the trading skills of the player and NPC. ///< This is used by every service to determine the price of objects given the trading skills of the player and NPC.
virtual int getDerivedDisposition(const MWWorld::Ptr& ptr) = 0; virtual int getDerivedDisposition(const MWWorld::Ptr& ptr, bool bounded = true) = 0;
///< Calculate the diposition of an NPC toward the player. ///< Calculate the diposition of an NPC toward the player.
virtual int countDeaths (const std::string& id) const = 0; virtual int countDeaths (const std::string& id) const = 0;

@ -145,7 +145,7 @@ bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info, bool invert
if (isCreature) if (isCreature)
return true; return true;
int actorDisposition = MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mActor) int actorDisposition = MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mActor, false)
+ MWBase::Environment::get().getDialogueManager()->getTemporaryDispositionChange(); + MWBase::Environment::get().getDialogueManager()->getTemporaryDispositionChange();
// For service refusal, the disposition check is inverted. However, a value of 0 still means "always succeed". // For service refusal, the disposition check is inverted. However, a value of 0 still means "always succeed".
return invert ? (info.mData.mDisposition == 0 || actorDisposition < info.mData.mDisposition) return invert ? (info.mData.mDisposition == 0 || actorDisposition < info.mData.mDisposition)

@ -581,7 +581,7 @@ namespace MWMechanics
mUpdatePlayer = true; mUpdatePlayer = true;
} }
int MechanicsManager::getDerivedDisposition(const MWWorld::Ptr& ptr) int MechanicsManager::getDerivedDisposition(const MWWorld::Ptr& ptr, bool bounded /* = true */)
{ {
const MWMechanics::NpcStats& npcSkill = ptr.getClass().getNpcStats(ptr); const MWMechanics::NpcStats& npcSkill = ptr.getClass().getNpcStats(ptr);
float x = static_cast<float>(npcSkill.getBaseDisposition()); float x = static_cast<float>(npcSkill.getBaseDisposition());
@ -653,7 +653,7 @@ namespace MWMechanics
x += ptr.getClass().getCreatureStats(ptr).getMagicEffects().get(ESM::MagicEffect::Charm).getMagnitude(); x += ptr.getClass().getCreatureStats(ptr).getMagicEffects().get(ESM::MagicEffect::Charm).getMagnitude();
int effective_disposition = std::max(0,std::min(int(x),100));//, normally clamped to [0..100] when used int effective_disposition = std::max(0,std::min(int(x), (bounded ? 100 : std::numeric_limits<int>::max()) )); // clamped to [0..100] unless !bounded
return effective_disposition; return effective_disposition;
} }

@ -92,7 +92,7 @@ namespace MWMechanics
virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying); virtual int getBarterOffer(const MWWorld::Ptr& ptr,int basePrice, bool buying);
///< This is used by every service to determine the price of objects given the trading skills of the player and NPC. ///< This is used by every service to determine the price of objects given the trading skills of the player and NPC.
virtual int getDerivedDisposition(const MWWorld::Ptr& ptr); virtual int getDerivedDisposition(const MWWorld::Ptr& ptr, bool bounded = true);
///< Calculate the diposition of an NPC toward the player. ///< Calculate the diposition of an NPC toward the player.
virtual int countDeaths (const std::string& id) const; virtual int countDeaths (const std::string& id) const;

Loading…
Cancel
Save