Merge branch 'regionsounds' into 'master'

Fix region sounds

See merge request OpenMW/openmw!370
pull/593/head
psi29a 4 years ago
commit f6e4c7cb42

@ -60,6 +60,7 @@
Bug #5639: Tooltips cover Messageboxes
Bug #5644: Summon effects running on the player during game initialization cause crashes
Bug #5656: Sneaking characters block hits while standing
Bug #5661: Region sounds don't play at the right interval
Feature #390: 3rd person look "over the shoulder"
Feature #2386: Distant Statics in the form of Object Paging
Feature #2404: Levelled List can not be placed into a container

@ -1,5 +1,6 @@
#include "regionsoundselector.hpp"
#include <components/fallback/fallback.hpp>
#include <components/misc/rng.hpp>
#include <algorithm>
@ -18,6 +19,11 @@ namespace MWSound
}
}
RegionSoundSelector::RegionSoundSelector()
: mMinTimeBetweenSounds(Fallback::Map::getFloat("Weather_Minimum_Time_Between_Environmental_Sounds"))
, mMaxTimeBetweenSounds(Fallback::Map::getFloat("Weather_Maximum_Time_Between_Environmental_Sounds"))
{}
std::optional<std::string> RegionSoundSelector::getNextRandom(float duration, const std::string& regionName,
const MWBase::World& world)
{
@ -27,9 +33,7 @@ namespace MWSound
return {};
const float a = Misc::Rng::rollClosedProbability();
// NOTE: We should use the "Minimum Time Between Environmental Sounds" and
// "Maximum Time Between Environmental Sounds" fallback settings here.
mTimeToNextEnvSound = 5.0f * a + 15.0f * (1.0f - a);
mTimeToNextEnvSound = mMinTimeBetweenSounds + (mMaxTimeBetweenSounds - mMinTimeBetweenSounds) * a;
mTimePassed = 0;
if (mLastRegionName != regionName)
@ -50,7 +54,7 @@ namespace MWSound
return {};
}
const int r = Misc::Rng::rollDice(mSumChance);
const int r = Misc::Rng::rollDice(std::max(mSumChance, 100));
int pos = 0;
const auto isSelected = [&] (const ESM::Region::SoundRef& sound)

@ -17,11 +17,15 @@ namespace MWSound
std::optional<std::string> getNextRandom(float duration, const std::string& regionName,
const MWBase::World& world);
RegionSoundSelector();
private:
float mTimeToNextEnvSound = 0.0f;
int mSumChance = 0;
std::string mLastRegionName;
float mTimePassed = 0.0;
float mMinTimeBetweenSounds;
float mMaxTimeBetweenSounds;
};
}

@ -895,9 +895,11 @@ namespace MWSound
if (!cell->isExterior())
return;
if (mCurrentRegionSound && mOutput->isSoundPlaying(mCurrentRegionSound))
return;
if (const auto next = mRegionSoundSelector.getNextRandom(duration, cell->mRegion, *world))
playSound(*next, 1.0f, 1.0f);
mCurrentRegionSound = playSound(*next, 1.0f, 1.0f);
}
void SoundManager::updateWaterSound()

@ -120,6 +120,8 @@ namespace MWSound
const ESM::Cell *mLastCell = nullptr;
Sound* mCurrentRegionSound;
Sound_Buffer *insertSound(const std::string &soundId, const ESM::Sound *sound);
Sound_Buffer *lookupSound(const std::string &soundId) const;

Loading…
Cancel
Save