mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-03 16:45:34 +00:00
Merge remote-tracking branch 'zini/master' into nifogre
This commit is contained in:
commit
76c8e81908
6 changed files with 80 additions and 53 deletions
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
struct ESMStore;
|
struct ESMStore;
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ namespace MWDialogue
|
||||||
static std::string idFromIndex (const std::string& topic, int index);
|
static std::string idFromIndex (const std::string& topic, int index);
|
||||||
};
|
};
|
||||||
|
|
||||||
/// \biref A quest entry with a timestamp.
|
/// \brief A quest entry with a timestamp.
|
||||||
struct StampedJournalEntry : public JournalEntry
|
struct StampedJournalEntry : public JournalEntry
|
||||||
{
|
{
|
||||||
int mDay;
|
int mDay;
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include "../mwbase/inputmanager.hpp" // FIXME
|
#include "../mwbase/inputmanager.hpp" // FIXME
|
||||||
#include "../mwbase/windowmanager.hpp" // FIXME
|
#include "../mwbase/windowmanager.hpp" // FIXME
|
||||||
|
|
||||||
|
#include "../mwmechanics/creaturestats.hpp"
|
||||||
|
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
#include "../mwworld/player.hpp"
|
#include "../mwworld/player.hpp"
|
||||||
|
|
||||||
|
@ -315,13 +317,15 @@ void RenderingManager::update (float duration, bool paused)
|
||||||
{
|
{
|
||||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
|
|
||||||
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||||
|
|
||||||
|
int blind = MWWorld::Class::get(player).getCreatureStats(player).getMagicEffects().get(MWMechanics::EffectKey(ESM::MagicEffect::Blind)).mMagnitude;
|
||||||
|
mRendering.getFader()->setFactor(1.f-(blind / 100.f));
|
||||||
|
|
||||||
|
setAmbientMode();
|
||||||
|
|
||||||
// player position
|
// player position
|
||||||
MWWorld::RefData &data =
|
MWWorld::RefData &data = player.getRefData();
|
||||||
MWBase::Environment::get()
|
|
||||||
.getWorld()
|
|
||||||
->getPlayer()
|
|
||||||
.getPlayer()
|
|
||||||
.getRefData();
|
|
||||||
float *_playerPos = data.getPosition().pos;
|
float *_playerPos = data.getPosition().pos;
|
||||||
Ogre::Vector3 playerPos(_playerPos[0], _playerPos[1], _playerPos[2]);
|
Ogre::Vector3 playerPos(_playerPos[0], _playerPos[1], _playerPos[2]);
|
||||||
|
|
||||||
|
@ -597,8 +601,15 @@ void RenderingManager::setSunColour(const Ogre::ColourValue& colour)
|
||||||
|
|
||||||
void RenderingManager::setAmbientColour(const Ogre::ColourValue& colour)
|
void RenderingManager::setAmbientColour(const Ogre::ColourValue& colour)
|
||||||
{
|
{
|
||||||
mRendering.getScene()->setAmbientLight(colour);
|
mAmbientColor = colour;
|
||||||
mTerrainManager->setAmbient(colour);
|
|
||||||
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||||
|
int nightEye = MWWorld::Class::get(player).getCreatureStats(player).getMagicEffects().get(MWMechanics::EffectKey(ESM::MagicEffect::NightEye)).mMagnitude;
|
||||||
|
Ogre::ColourValue final = colour;
|
||||||
|
final += Ogre::ColourValue(0.7,0.7,0.7,0) * std::min(1.f, (nightEye/100.f));
|
||||||
|
|
||||||
|
mRendering.getScene()->setAmbientLight(final);
|
||||||
|
mTerrainManager->setAmbient(final);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::sunEnable(bool real)
|
void RenderingManager::sunEnable(bool real)
|
||||||
|
|
|
@ -193,59 +193,68 @@ void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::
|
||||||
{
|
{
|
||||||
count = std::abs(count); /// \todo implement item restocking (indicated by negative count)
|
count = std::abs(count); /// \todo implement item restocking (indicated by negative count)
|
||||||
|
|
||||||
ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), id);
|
try
|
||||||
|
|
||||||
if (ref.getPtr().getTypeName()==typeid (ESM::ItemLevList).name())
|
|
||||||
{
|
{
|
||||||
const ESM::ItemLevList* levItem = ref.getPtr().get<ESM::ItemLevList>()->mBase;
|
ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), id);
|
||||||
const std::vector<ESM::LeveledListBase::LevelItem>& items = levItem->mList;
|
|
||||||
|
|
||||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
if (ref.getPtr().getTypeName()==typeid (ESM::ItemLevList).name())
|
||||||
int playerLevel = MWWorld::Class::get(player).getCreatureStats(player).getLevel();
|
|
||||||
|
|
||||||
failChance += levItem->mChanceNone;
|
|
||||||
|
|
||||||
if (topLevel && count > 1 && levItem->mFlags & ESM::ItemLevList::Each)
|
|
||||||
{
|
{
|
||||||
for (int i=0; i<count; ++i)
|
const ESM::ItemLevList* levItem = ref.getPtr().get<ESM::ItemLevList>()->mBase;
|
||||||
addInitialItem(id, owner, 1, failChance, false);
|
const std::vector<ESM::LeveledListBase::LevelItem>& items = levItem->mList;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
float random = static_cast<float> (std::rand()) / RAND_MAX;
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
|
||||||
if (random >= failChance/100.f)
|
int playerLevel = MWWorld::Class::get(player).getCreatureStats(player).getLevel();
|
||||||
{
|
|
||||||
std::vector<std::string> candidates;
|
failChance += levItem->mChanceNone;
|
||||||
int highestLevel = 0;
|
|
||||||
for (std::vector<ESM::LeveledListBase::LevelItem>::const_iterator it = items.begin(); it != items.end(); ++it)
|
if (topLevel && count > 1 && levItem->mFlags & ESM::ItemLevList::Each)
|
||||||
{
|
{
|
||||||
if (it->mLevel > highestLevel)
|
for (int i=0; i<count; ++i)
|
||||||
highestLevel = it->mLevel;
|
addInitialItem(id, owner, 1, failChance, false);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int, std::string> highest = std::make_pair(-1, "");
|
float random = static_cast<float> (std::rand()) / RAND_MAX;
|
||||||
for (std::vector<ESM::LeveledListBase::LevelItem>::const_iterator it = items.begin(); it != items.end(); ++it)
|
if (random >= failChance/100.f)
|
||||||
{
|
{
|
||||||
if (playerLevel >= it->mLevel
|
std::vector<std::string> candidates;
|
||||||
&& (levItem->mFlags & ESM::ItemLevList::AllLevels || it->mLevel == highestLevel))
|
int highestLevel = 0;
|
||||||
|
for (std::vector<ESM::LeveledListBase::LevelItem>::const_iterator it = items.begin(); it != items.end(); ++it)
|
||||||
{
|
{
|
||||||
candidates.push_back(it->mId);
|
if (it->mLevel > highestLevel)
|
||||||
if (it->mLevel >= highest.first)
|
highestLevel = it->mLevel;
|
||||||
highest = std::make_pair(it->mLevel, it->mId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<int, std::string> highest = std::make_pair(-1, "");
|
||||||
|
for (std::vector<ESM::LeveledListBase::LevelItem>::const_iterator it = items.begin(); it != items.end(); ++it)
|
||||||
|
{
|
||||||
|
if (playerLevel >= it->mLevel
|
||||||
|
&& (levItem->mFlags & ESM::ItemLevList::AllLevels || it->mLevel == highestLevel))
|
||||||
|
{
|
||||||
|
candidates.push_back(it->mId);
|
||||||
|
if (it->mLevel >= highest.first)
|
||||||
|
highest = std::make_pair(it->mLevel, it->mId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (!candidates.size())
|
||||||
|
return;
|
||||||
|
std::string item = candidates[std::rand()%candidates.size()];
|
||||||
|
addInitialItem(item, owner, count, failChance, false);
|
||||||
}
|
}
|
||||||
if (!candidates.size())
|
}
|
||||||
return;
|
else
|
||||||
std::string item = candidates[std::rand()%candidates.size()];
|
{
|
||||||
addInitialItem(item, owner, count, failChance, false);
|
ref.getPtr().getRefData().setCount (count);
|
||||||
|
ref.getPtr().getCellRef().mOwner = owner;
|
||||||
|
addImp (ref.getPtr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (std::logic_error& e)
|
||||||
{
|
{
|
||||||
ref.getPtr().getRefData().setCount (count);
|
// Vanilla doesn't fail on nonexistent items in levelled lists
|
||||||
ref.getPtr().getCellRef().mOwner = owner;
|
std::cerr << "Warning: ignoring nonexistent item '" << id << "'" << std::endl;
|
||||||
addImp (ref.getPtr());
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
<Property key="OffsetHeight" value="0"/>
|
<Property key="OffsetHeight" value="0"/>
|
||||||
<Codes>
|
<Codes>
|
||||||
<Code range="33 126"/>
|
<Code range="33 126"/>
|
||||||
|
<Code range="160"/> <!-- Non-breaking space -->
|
||||||
<Code range="192 382"/> <!-- Central and Eastern European languages glyphs -->
|
<Code range="192 382"/> <!-- Central and Eastern European languages glyphs -->
|
||||||
<Code range="1025 1105"/>
|
<Code range="1025 1105"/>
|
||||||
<Code range="2026"/> <!-- Ellipsis -->
|
<Code range="2026"/> <!-- Ellipsis -->
|
||||||
|
|
|
@ -19,6 +19,7 @@ Fader::Fader(Ogre::SceneManager* sceneMgr)
|
||||||
, mTargetAlpha(0.f)
|
, mTargetAlpha(0.f)
|
||||||
, mCurrentAlpha(0.f)
|
, mCurrentAlpha(0.f)
|
||||||
, mStartAlpha(0.f)
|
, mStartAlpha(0.f)
|
||||||
|
, mFactor(1.f)
|
||||||
{
|
{
|
||||||
// Create the fading material
|
// Create the fading material
|
||||||
MaterialPtr material = MaterialManager::getSingleton().create("FadeInOutMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
|
MaterialPtr material = MaterialManager::getSingleton().create("FadeInOutMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
|
||||||
|
@ -62,19 +63,20 @@ void Fader::update(float dt)
|
||||||
mCurrentAlpha += dt/mTargetTime * (mTargetAlpha-mStartAlpha);
|
mCurrentAlpha += dt/mTargetTime * (mTargetAlpha-mStartAlpha);
|
||||||
if (mCurrentAlpha > mTargetAlpha) mCurrentAlpha = mTargetAlpha;
|
if (mCurrentAlpha > mTargetAlpha) mCurrentAlpha = mTargetAlpha;
|
||||||
}
|
}
|
||||||
|
|
||||||
applyAlpha();
|
|
||||||
|
|
||||||
mRemainingTime -= dt;
|
mRemainingTime -= dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mCurrentAlpha == 0.f) mRectangle->setVisible(false);
|
if (1.f-((1.f-mCurrentAlpha) * mFactor) == 0.f)
|
||||||
|
mRectangle->setVisible(false);
|
||||||
|
else
|
||||||
|
applyAlpha();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fader::applyAlpha()
|
void Fader::applyAlpha()
|
||||||
{
|
{
|
||||||
mRectangle->setVisible(true);
|
mRectangle->setVisible(true);
|
||||||
mFadeTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, mCurrentAlpha);
|
mFadeTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, 1.f-((1.f-mCurrentAlpha) * mFactor));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fader::fadeIn(float time)
|
void Fader::fadeIn(float time)
|
||||||
|
|
|
@ -29,6 +29,8 @@ namespace Render
|
||||||
void fadeOut(const float time);
|
void fadeOut(const float time);
|
||||||
void fadeTo(const int percent, const float time);
|
void fadeTo(const int percent, const float time);
|
||||||
|
|
||||||
|
void setFactor (float factor) { mFactor = factor; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum FadingMode
|
enum FadingMode
|
||||||
{
|
{
|
||||||
|
@ -49,6 +51,8 @@ namespace Render
|
||||||
float mCurrentAlpha;
|
float mCurrentAlpha;
|
||||||
float mStartAlpha;
|
float mStartAlpha;
|
||||||
|
|
||||||
|
float mFactor;
|
||||||
|
|
||||||
Ogre::SceneManager* mSceneMgr;
|
Ogre::SceneManager* mSceneMgr;
|
||||||
};
|
};
|
||||||
}}
|
}}
|
||||||
|
|
Loading…
Reference in a new issue