mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-10-31 13:56:45 +00:00 
			
		
		
		
	Merge pull request #2187 from elsid/random_seed_option
Option to set specific random seed for random number generator
This commit is contained in:
		
						commit
						4fd613fa15
					
				
					 7 changed files with 30 additions and 5 deletions
				
			
		|  | @ -45,6 +45,7 @@ | |||
|     Feature #4730: Native animated containers support | ||||
|     Feature #4812: Support NiSwitchNode | ||||
|     Feature #4836: Daytime node switch | ||||
|     Feature #4887: Add openmw command option to set initial random seed | ||||
|     Task #4686: Upgrade media decoder to a more current FFmpeg API | ||||
| 
 | ||||
| 0.45.0 | ||||
|  |  | |||
|  | @ -105,3 +105,4 @@ Command line options | |||
|       --export-fonts [=arg(=1)] (=0)        Export Morrowind .fnt fonts to PNG | ||||
|                                             image and XML file in current directory | ||||
|       --activate-dist arg (=-1)             activation distance override | ||||
|       --random-seed arg (=<impl defined>)   seed value for random number generator | ||||
|  |  | |||
|  | @ -228,7 +228,6 @@ OMW::Engine::Engine(Files::ConfigurationManager& configurationManager) | |||
|   , mNewGame (false) | ||||
|   , mCfgMgr(configurationManager) | ||||
| { | ||||
|     Misc::Rng::init(); | ||||
|     MWClass::registerClasses(); | ||||
| 
 | ||||
|     Uint32 flags = SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE|SDL_INIT_GAMECONTROLLER|SDL_INIT_JOYSTICK; | ||||
|  | @ -653,6 +652,8 @@ void OMW::Engine::go() | |||
| 
 | ||||
|     Log(Debug::Info) << "OSG version: " << osgGetVersion(); | ||||
| 
 | ||||
|     Misc::Rng::init(mRandomSeed); | ||||
| 
 | ||||
|     // Load settings
 | ||||
|     Settings::Manager settings; | ||||
|     std::string settingspath; | ||||
|  | @ -821,3 +822,8 @@ void OMW::Engine::setSaveGameFile(const std::string &savegame) | |||
| { | ||||
|     mSaveGameFile = savegame; | ||||
| } | ||||
| 
 | ||||
| void OMW::Engine::setRandomSeed(unsigned int seed) | ||||
| { | ||||
|     mRandomSeed = seed; | ||||
| } | ||||
|  |  | |||
|  | @ -100,6 +100,7 @@ namespace OMW | |||
|             bool mGrab; | ||||
| 
 | ||||
|             bool mExportFonts; | ||||
|             unsigned int mRandomSeed; | ||||
| 
 | ||||
|             Compiler::Extensions mExtensions; | ||||
|             Compiler::Context *mScriptContext; | ||||
|  | @ -203,6 +204,8 @@ namespace OMW | |||
|             /// Set the save game file to load after initialising the engine.
 | ||||
|             void setSaveGameFile(const std::string& savegame); | ||||
| 
 | ||||
|             void setRandomSeed(unsigned int seed); | ||||
| 
 | ||||
|         private: | ||||
|             Files::ConfigurationManager& mCfgMgr; | ||||
|     }; | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| #include <components/files/escape.hpp> | ||||
| #include <components/fallback/validate.hpp> | ||||
| #include <components/debug/debugging.hpp> | ||||
| #include <components/misc/rng.hpp> | ||||
| 
 | ||||
| #include "engine.hpp" | ||||
| 
 | ||||
|  | @ -131,7 +132,12 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat | |||
|         ("export-fonts", bpo::value<bool>()->implicit_value(true) | ||||
|             ->default_value(false), "Export Morrowind .fnt fonts to PNG image and XML file in current directory") | ||||
| 
 | ||||
|         ("activate-dist", bpo::value <int> ()->default_value (-1), "activation distance override"); | ||||
|         ("activate-dist", bpo::value <int> ()->default_value (-1), "activation distance override") | ||||
| 
 | ||||
|         ("random-seed", bpo::value <unsigned int> () | ||||
|             ->default_value(Misc::Rng::generateDefaultSeed()), | ||||
|             "seed value for random number generator") | ||||
|     ; | ||||
| 
 | ||||
|     bpo::parsed_options valid_opts = bpo::command_line_parser(argc, argv) | ||||
|         .options(desc).allow_unregistered().run(); | ||||
|  | @ -231,6 +237,7 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat | |||
|     engine.setFallbackValues(variables["fallback"].as<FallbackMap>().mMap); | ||||
|     engine.setActivationDistanceOverride (variables["activate-dist"].as<int>()); | ||||
|     engine.enableFontExport(variables["export-fonts"].as<bool>()); | ||||
|     engine.setRandomSeed(variables["random-seed"].as<unsigned int>()); | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
|  |  | |||
|  | @ -8,9 +8,9 @@ namespace Misc | |||
| 
 | ||||
|     std::mt19937 Rng::generator = std::mt19937(); | ||||
| 
 | ||||
|     void Rng::init() | ||||
|     void Rng::init(unsigned int seed) | ||||
|     { | ||||
|         generator.seed(static_cast<unsigned int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())); | ||||
|         generator.seed(seed); | ||||
|     } | ||||
| 
 | ||||
|     float Rng::rollProbability() | ||||
|  | @ -28,4 +28,8 @@ namespace Misc | |||
|         return max > 0 ? std::uniform_int_distribution<int>(0, max - 1)(generator) : 0; | ||||
|     } | ||||
| 
 | ||||
|     unsigned int Rng::generateDefaultSeed() | ||||
|     { | ||||
|         return static_cast<unsigned int>(std::chrono::high_resolution_clock::now().time_since_epoch().count()); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ public: | |||
|     static std::mt19937 generator; | ||||
| 
 | ||||
|     /// seed the RNG
 | ||||
|     static void init(); | ||||
|     static void init(unsigned int seed = generateDefaultSeed()); | ||||
| 
 | ||||
|     /// return value in range [0.0f, 1.0f)  <- note open upper range.
 | ||||
|     static float rollProbability(); | ||||
|  | @ -31,6 +31,9 @@ public: | |||
| 
 | ||||
|     /// return value in range [0, 99]
 | ||||
|     static int roll0to99() { return rollDice(100); } | ||||
| 
 | ||||
|     /// returns default seed for RNG
 | ||||
|     static unsigned int generateDefaultSeed(); | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue