Merge remote-tracking branch 'scrawl/master'

test
Marc Zinnschlag 10 years ago
commit 83a7eea2a9

@ -1,7 +1,7 @@
OpenMW OpenMW
====== ======
[![Build Status](https://img.shields.io/travis/OpenMW/openmw.svg?style=plastic)](https://travis-ci.org/OpenMW/openmw) [![Coverity Scan Build Status](https://scan.coverity.com/projects/3740/badge.svg)](https://scan.coverity.com/projects/3740) [![Build Status](https://img.shields.io/travis/OpenMW/openmw.svg)](https://travis-ci.org/OpenMW/openmw) [![Coverity Scan Build Status](https://scan.coverity.com/projects/3740/badge.svg)](https://scan.coverity.com/projects/3740)
OpenMW is an attempt at recreating the engine for the popular role-playing game OpenMW is an attempt at recreating the engine for the popular role-playing game
Morrowind by Bethesda Softworks. You need to own and install the original game for OpenMW to work. Morrowind by Bethesda Softworks. You need to own and install the original game for OpenMW to work.

@ -593,7 +593,10 @@ namespace MWGui
for (std::vector<std::pair<std::string, int> >::const_iterator it = itemOwners.begin(); it != itemOwners.end(); ++it) for (std::vector<std::pair<std::string, int> >::const_iterator it = itemOwners.begin(); it != itemOwners.end(); ++it)
{ {
ret += std::string("\nStolen from ") + it->first; if (it->second == std::numeric_limits<int>::max())
ret += std::string("\nStolen from ") + it->first; // for legacy (ESS) savegames
else
ret += std::string("\nStolen ") + MyGUI::utility::toString(it->second) + " from " + it->first;
} }
ret += getMiscString(cellref.getGlobalVariable(), "Global"); ret += getMiscString(cellref.getGlobalVariable(), "Global");

@ -52,6 +52,31 @@ namespace
return ((50.f - disposition) * fFightDispMult); return ((50.f - disposition) * fFightDispMult);
} }
void getPersuasionRatings(const MWMechanics::NpcStats& stats, float& rating1, float& rating2, float& rating3, bool player)
{
const MWWorld::Store<ESM::GameSetting> &gmst =
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
float persTerm = stats.getAttribute(ESM::Attribute::Personality).getModified() / gmst.find("fPersonalityMod")->getFloat();
float luckTerm = stats.getAttribute(ESM::Attribute::Luck).getModified() / gmst.find("fLuckMod")->getFloat();
float repTerm = stats.getReputation() * gmst.find("fReputationMod")->getFloat();
float fatigueTerm = stats.getFatigueTerm();
float levelTerm = stats.getLevel() * gmst.find("fLevelMod")->getFloat();
rating1 = (repTerm + luckTerm + persTerm + stats.getSkill(ESM::Skill::Speechcraft).getModified()) * fatigueTerm;
if (player)
{
rating2 = rating1 + levelTerm;
rating3 = (stats.getSkill(ESM::Skill::Mercantile).getModified() + luckTerm + persTerm) * fatigueTerm;
}
else
{
rating2 = (levelTerm + repTerm + luckTerm + persTerm + stats.getSkill(ESM::Skill::Speechcraft).getModified()) * fatigueTerm;
rating3 = (stats.getSkill(ESM::Skill::Mercantile).getModified() + repTerm + luckTerm + persTerm) * fatigueTerm;
}
}
} }
namespace MWMechanics namespace MWMechanics
@ -685,24 +710,11 @@ namespace MWMechanics
MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld()->getPlayerPtr(); MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld()->getPlayerPtr();
const MWMechanics::NpcStats &playerStats = playerPtr.getClass().getNpcStats(playerPtr); const MWMechanics::NpcStats &playerStats = playerPtr.getClass().getNpcStats(playerPtr);
float persTerm = playerStats.getAttribute(ESM::Attribute::Personality).getModified() float npcRating1, npcRating2, npcRating3;
/ gmst.find("fPersonalityMod")->getFloat(); getPersuasionRatings(npcStats, npcRating1, npcRating2, npcRating3, false);
float luckTerm = playerStats.getAttribute(ESM::Attribute::Luck).getModified()
/ gmst.find("fLuckMod")->getFloat();
float repTerm = playerStats.getReputation() * gmst.find("fReputationMod")->getFloat(); float playerRating1, playerRating2, playerRating3;
float levelTerm = playerStats.getLevel() * gmst.find("fLevelMod")->getFloat(); getPersuasionRatings(playerStats, playerRating1, playerRating2, playerRating3, true);
float fatigueTerm = playerStats.getFatigueTerm();
float playerRating1 = (repTerm + luckTerm + persTerm + playerStats.getSkill(ESM::Skill::Speechcraft).getModified()) * fatigueTerm;
float playerRating2 = playerRating1 + levelTerm;
float playerRating3 = (playerStats.getSkill(ESM::Skill::Mercantile).getModified() + luckTerm + persTerm) * fatigueTerm;
float npcRating1 = (repTerm + luckTerm + persTerm + playerStats.getSkill(ESM::Skill::Speechcraft).getModified()) * fatigueTerm;
float npcRating2 = (levelTerm + repTerm + luckTerm + persTerm + npcStats.getSkill(ESM::Skill::Speechcraft).getModified()) * fatigueTerm;
float npcRating3 = (playerStats.getSkill(ESM::Skill::Mercantile).getModified() + repTerm + luckTerm + persTerm) * fatigueTerm;
int currentDisposition = std::min(100, std::max(0, int(getDerivedDisposition(npc) + currentTemporaryDispositionDelta))); int currentDisposition = std::min(100, std::max(0, int(getDerivedDisposition(npc) + currentTemporaryDispositionDelta)));
@ -1030,6 +1042,8 @@ namespace MWMechanics
owner.second = true; owner.second = true;
} }
Misc::StringUtils::toLower(owner.first); Misc::StringUtils::toLower(owner.first);
if (!Misc::StringUtils::ciEqual(item.getCellRef().getRefId(), MWWorld::ContainerStore::sGoldId))
mStolenItems[Misc::StringUtils::lowerCase(item.getClass().getId(item))][owner] += count; mStolenItems[Misc::StringUtils::lowerCase(item.getClass().getId(item))][owner] += count;
commitCrime(ptr, victim, OT_Theft, item.getClass().getValue(item) * count); commitCrime(ptr, victim, OT_Theft, item.getClass().getValue(item) * count);

@ -274,9 +274,9 @@ void ManualBulletShapeLoader::handleNode(const Nif::Node *node, int flags,
// No collision. Use an internal flag setting to mark this. // No collision. Use an internal flag setting to mark this.
flags |= 0x800; flags |= 0x800;
} }
else if (sd->string == "MRK" && !mShowMarkers && raycasting) else if (sd->string == "MRK" && !mShowMarkers && (raycasting || mShape->mAutogenerated))
{ {
// Marker objects should be invisible, but still have collision. // Marker objects should be invisible, but can still have collision if the model explicitely specifies it via a RootCollisionNode.
// Except in the editor, the marker objects are visible. // Except in the editor, the marker objects are visible.
return; return;
} }

@ -58,6 +58,19 @@ Ogre::HardwareIndexBufferSharedPtr createIndexBuffer(unsigned int flags, unsigne
for (size_t row = rowStart; row < rowEnd; row += increment) for (size_t row = rowStart; row < rowEnd; row += increment)
{ {
for (size_t col = colStart; col < colEnd; col += increment) for (size_t col = colStart; col < colEnd; col += increment)
{
// diamond pattern
if ((row + col%2) % 2 == 1)
{
indices.push_back(verts*(col+increment)+row);
indices.push_back(verts*(col+increment)+row+increment);
indices.push_back(verts*col+row+increment);
indices.push_back(verts*col+row);
indices.push_back(verts*(col+increment)+row);
indices.push_back(verts*(col)+row+increment);
}
else
{ {
indices.push_back(verts*col+row); indices.push_back(verts*col+row);
indices.push_back(verts*(col+increment)+row+increment); indices.push_back(verts*(col+increment)+row+increment);
@ -68,6 +81,7 @@ Ogre::HardwareIndexBufferSharedPtr createIndexBuffer(unsigned int flags, unsigne
indices.push_back(verts*(col+increment)+row+increment); indices.push_back(verts*(col+increment)+row+increment);
} }
} }
}
size_t innerStep = increment; size_t innerStep = increment;
if (anyDeltas) if (anyDeltas)

Loading…
Cancel
Save