From 123dad2e23010b802256099a5fa112cffa554282 Mon Sep 17 00:00:00 2001 From: collett Date: Tue, 14 Mar 2023 18:22:41 +0900 Subject: [PATCH] update rng to RandGenerator --- src/world/Math/CalcStats.cpp | 25 ++++++++++++++++--------- src/world/Math/CalcStats.h | 8 ++++---- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/world/Math/CalcStats.cpp b/src/world/Math/CalcStats.cpp index 7c7980e9..b08bd833 100644 --- a/src/world/Math/CalcStats.cpp +++ b/src/world/Math/CalcStats.cpp @@ -85,9 +85,7 @@ const int levelTable[61][6] = { 218, 354, 858, 2600, 282, 215 }, }; -std::random_device CalcStats::dev; -std::mt19937 CalcStats::rng( dev() ); -std::uniform_int_distribution< std::mt19937::result_type > CalcStats::range100( 0, 99 ); +std::unique_ptr< RandGenerator< float > > CalcStats::rnd = nullptr; /* Class used for battle-related formulas and calculations. @@ -570,13 +568,13 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcAutoA factor = std::floor( factor * speed( chara ) ); - if( criticalHitProbability( chara ) > range100( rng ) ) + if( criticalHitProbability( chara ) > getRandomNumber0To100() ) { factor *= criticalHitBonus( chara ); hitType = Sapphire::Common::ActionHitSeverityType::CritDamage; } - factor *= 1.0f + ( ( range100( rng ) - 50.0f ) / 1000.0f ); + factor *= 1.0f + ( ( getRandomNumber0To100() - 50.0f ) / 1000.0f ); // todo: buffs @@ -607,13 +605,13 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio auto factor = Common::Util::trunc( pot * wd * ap * det, 0 ); Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalDamage; - if( criticalHitProbability( chara ) > range100( rng ) ) + if( criticalHitProbability( chara ) > getRandomNumber0To100() ) { factor *= criticalHitBonus( chara ); hitType = Sapphire::Common::ActionHitSeverityType::CritDamage; } - factor *= 1.0f + ( ( range100( rng ) - 50.0f ) / 1000.0f ); + factor *= 1.0f + ( ( getRandomNumber0To100() - 50.0f ) / 1000.0f ); // todo: buffs @@ -640,13 +638,13 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio auto factor = std::floor( ( wepDmg * ( mnd / 200 ) + ( det / 10 ) ) * ( ptc / 100 ) * 1.3f ); Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalHeal; - if( criticalHitProbability( chara ) > range100( rng ) ) + if( criticalHitProbability( chara ) > getRandomNumber0To100() ) { factor *= criticalHitBonus( chara ); hitType = Sapphire::Common::ActionHitSeverityType::CritHeal; } - factor *= 1.0f + ( ( range100( rng ) - 50.0f ) / 1000.0f ); + factor *= 1.0f + ( ( getRandomNumber0To100() - 50.0f ) / 1000.0f ); return std::pair( factor, hitType ); } @@ -654,4 +652,13 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio uint32_t CalcStats::primaryStatValue( const Sapphire::Entity::Chara& chara ) { return chara.getStatValue( chara.getPrimaryStat() ); +} + +float CalcStats::getRandomNumber0To100() +{ + if( !rnd ) + { + rnd = std::make_unique< RandGenerator< float > >( Common::Service< RNGMgr >::ref().getRandGenerator< float >( 0, 100 ) ); + } + return rnd->next(); } \ No newline at end of file diff --git a/src/world/Math/CalcStats.h b/src/world/Math/CalcStats.h index 1e80ca81..0d8f1cb4 100644 --- a/src/world/Math/CalcStats.h +++ b/src/world/Math/CalcStats.h @@ -1,11 +1,12 @@ #pragma once -#include #include #include "Forwards.h" +#include "Manager/RNGMgr.h" namespace Sapphire::Math { + using namespace Sapphire::World::Manager; class CalcStats { @@ -151,9 +152,8 @@ namespace Sapphire::Math */ static float calcAttackPower( const Sapphire::Entity::Chara& chara, uint32_t attackPower ); - static std::random_device dev; - static std::mt19937 rng; - static std::uniform_int_distribution< std::mt19937::result_type > range100; + static float getRandomNumber0To100(); + static std::unique_ptr< RandGenerator< float > > rnd; }; }