mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 18:35:20 +00:00
Merge branch 'regionsounds' into 'master'
Fix region sounds See merge request OpenMW/openmw!370
This commit is contained in:
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…
x
Reference in New Issue
Block a user