mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 21:26:41 +00:00 
			
		
		
		
	Merge branch 'regionsounds' into 'master'
Fix region sounds See merge request OpenMW/openmw!370
This commit is contained in:
		
						commit
						f6e4c7cb42
					
				
					 5 changed files with 18 additions and 5 deletions
				
			
		|  | @ -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…
	
		Reference in a new issue