Fix disposition changes from trades not applying properly

This commit is contained in:
scrawl 2014-01-08 01:24:06 +01:00
parent 728365b48d
commit c85c2cff4e
6 changed files with 23 additions and 6 deletions

View file

@ -51,7 +51,7 @@ namespace MWBase
virtual void persuade (int type) = 0; virtual void persuade (int type) = 0;
virtual int getTemporaryDispositionChange () const = 0; virtual int getTemporaryDispositionChange () const = 0;
virtual void applyTemporaryDispositionChange (int delta) = 0; virtual void applyDispositionChange (int delta) = 0;
}; };
} }

View file

@ -126,6 +126,8 @@ namespace MWDialogue
void DialogueManager::startDialogue (const MWWorld::Ptr& actor) void DialogueManager::startDialogue (const MWWorld::Ptr& actor)
{ {
mLastTopic = ""; mLastTopic = "";
mPermanentDispositionChange = 0;
mTemporaryDispositionChange = 0;
mChoice = -1; mChoice = -1;
mIsInChoice = false; mIsInChoice = false;
@ -514,9 +516,19 @@ namespace MWDialogue
return mTemporaryDispositionChange; return mTemporaryDispositionChange;
} }
void DialogueManager::applyTemporaryDispositionChange(int delta) void DialogueManager::applyDispositionChange(int delta)
{ {
int oldTemp = mTemporaryDispositionChange;
mTemporaryDispositionChange += delta; mTemporaryDispositionChange += delta;
// don't allow increasing beyond 100 or decreasing below 0
int curDisp = MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mActor);
if (curDisp + mTemporaryDispositionChange < 0)
mTemporaryDispositionChange = -curDisp;
else if (curDisp + mTemporaryDispositionChange > 100)
mTemporaryDispositionChange = 100 - curDisp;
int diff = mTemporaryDispositionChange - oldTemp;
mPermanentDispositionChange += diff;
} }
bool DialogueManager::checkServiceRefused() bool DialogueManager::checkServiceRefused()

View file

@ -76,7 +76,7 @@ namespace MWDialogue
virtual void persuade (int type); virtual void persuade (int type);
virtual int getTemporaryDispositionChange () const; virtual int getTemporaryDispositionChange () const;
virtual void applyTemporaryDispositionChange (int delta); virtual void applyDispositionChange (int delta);
}; };

View file

@ -319,7 +319,7 @@ namespace MWGui
messageBox("#{sNotifyMessage9}"); messageBox("#{sNotifyMessage9}");
int iBarterFailDisposition = gmst.find("iBarterFailDisposition")->getInt(); int iBarterFailDisposition = gmst.find("iBarterFailDisposition")->getInt();
MWBase::Environment::get().getDialogueManager()->applyTemporaryDispositionChange(iBarterFailDisposition); MWBase::Environment::get().getDialogueManager()->applyDispositionChange(iBarterFailDisposition);
return; return;
} }
@ -328,7 +328,7 @@ namespace MWGui
} }
int iBarterSuccessDisposition = gmst.find("iBarterSuccessDisposition")->getInt(); int iBarterSuccessDisposition = gmst.find("iBarterSuccessDisposition")->getInt();
MWBase::Environment::get().getDialogueManager()->applyTemporaryDispositionChange(iBarterSuccessDisposition); MWBase::Environment::get().getDialogueManager()->applyDispositionChange(iBarterSuccessDisposition);
// make the item transfer // make the item transfer
mTradeModel->transferItems(); mTradeModel->transferItems();

View file

@ -248,7 +248,8 @@ namespace MWMechanics
void CreatureStats::setAiSetting (AiSetting index, int base) void CreatureStats::setAiSetting (AiSetting index, int base)
{ {
Stat<int> stat(base); Stat<int> stat = getAiSetting(index);
stat.setBase(base);
setAiSetting(index, stat); setAiSetting(index, stat);
} }

View file

@ -749,11 +749,15 @@ namespace MWMechanics
if (!owner.empty()) if (!owner.empty())
victim = MWBase::Environment::get().getWorld()->getPtr(owner, true); victim = MWBase::Environment::get().getWorld()->getPtr(owner, true);
// TODO: expell from faction
commitCrime(ptr, victim, OT_Theft, item.getClass().getValue(item) * count); commitCrime(ptr, victim, OT_Theft, item.getClass().getValue(item) * count);
} }
void MechanicsManager::commitCrime(const MWWorld::Ptr &ptr, const MWWorld::Ptr &victim, OffenseType type, int arg) void MechanicsManager::commitCrime(const MWWorld::Ptr &ptr, const MWWorld::Ptr &victim, OffenseType type, int arg)
{ {
// TODO: expell from faction
bool reported=false; bool reported=false;
for (Actors::PtrControllerMap::const_iterator it = mActors.begin(); it != mActors.end(); ++it) for (Actors::PtrControllerMap::const_iterator it = mActors.begin(); it != mActors.end(); ++it)
{ {