forked from mirror/openmw-tes3mp
ca8c8c6aa4
conversion from 'const float' to 'int', possible loss of data conversion from 'double' to 'int', possible loss of data conversion from 'float' to 'int', possible loss of data
69 lines
2.3 KiB
C++
69 lines
2.3 KiB
C++
#include "pickpocket.hpp"
|
|
|
|
#include "../mwworld/class.hpp"
|
|
#include "../mwworld/esmstore.hpp"
|
|
|
|
#include "../mwbase/world.hpp"
|
|
#include "../mwbase/environment.hpp"
|
|
|
|
#include "npcstats.hpp"
|
|
|
|
namespace MWMechanics
|
|
{
|
|
|
|
Pickpocket::Pickpocket(const MWWorld::Ptr &thief, const MWWorld::Ptr &victim)
|
|
: mThief(thief)
|
|
, mVictim(victim)
|
|
{
|
|
}
|
|
|
|
float Pickpocket::getChanceModifier(const MWWorld::Ptr &ptr, float add)
|
|
{
|
|
NpcStats& stats = ptr.getClass().getNpcStats(ptr);
|
|
float agility = static_cast<float>(stats.getAttribute(ESM::Attribute::Agility).getModified());
|
|
float luck = static_cast<float>(stats.getAttribute(ESM::Attribute::Luck).getModified());
|
|
float sneak = static_cast<float>(ptr.getClass().getSkill(ptr, ESM::Skill::Sneak));
|
|
return (add + 0.2f * agility + 0.1f * luck + sneak) * stats.getFatigueTerm();
|
|
}
|
|
|
|
bool Pickpocket::getDetected(float valueTerm)
|
|
{
|
|
float x = getChanceModifier(mThief);
|
|
float y = getChanceModifier(mVictim, valueTerm);
|
|
|
|
float t = 2*x - y;
|
|
|
|
float pcSneak = static_cast<float>(mThief.getClass().getSkill(mThief, ESM::Skill::Sneak));
|
|
int iPickMinChance = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>()
|
|
.find("iPickMinChance")->getInt();
|
|
int iPickMaxChance = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>()
|
|
.find("iPickMaxChance")->getInt();
|
|
|
|
int roll = static_cast<int>(std::rand() / (static_cast<double> (RAND_MAX)+1) * 100); // [0, 99]
|
|
if (t < pcSneak / iPickMinChance)
|
|
{
|
|
return (roll > int(pcSneak / iPickMinChance));
|
|
}
|
|
else
|
|
{
|
|
t = std::min(float(iPickMaxChance), t);
|
|
return (roll > int(t));
|
|
}
|
|
}
|
|
|
|
bool Pickpocket::pick(MWWorld::Ptr item, int count)
|
|
{
|
|
float stackValue = static_cast<float>(item.getClass().getValue(item) * count);
|
|
float fPickPocketMod = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>()
|
|
.find("fPickPocketMod")->getFloat();
|
|
float valueTerm = 10 * fPickPocketMod * stackValue;
|
|
|
|
return getDetected(valueTerm);
|
|
}
|
|
|
|
bool Pickpocket::finish()
|
|
{
|
|
return getDetected(0.f);
|
|
}
|
|
|
|
}
|