From a1ddab9eb5465b118d08ccb746dc1ce9fd4f4cc6 Mon Sep 17 00:00:00 2001 From: GibHaltmannKill <67860669+GibHaltmannKill@users.noreply.github.com> Date: Wed, 7 Oct 2026 21:18:28 +0300 Subject: [PATCH] Reworked `RPUtlRandom` --- config/RSPE01_01/symbols.txt | 2 +- include/Pack/RPUtility/RPUtlRandom.h | 28 ++++++++++++++++++++++------ src/Pack/RPUtility/RPUtlRandom.cpp | 7 +++++-- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/config/RSPE01_01/symbols.txt b/config/RSPE01_01/symbols.txt index 4ea2385f4..ec42efd5e 100644 --- a/config/RSPE01_01/symbols.txt +++ b/config/RSPE01_01/symbols.txt @@ -21934,7 +21934,7 @@ lbl_804BF674 = .sbss:0x804BF674; // type:object size:0x4 data:4byte lbl_804BF678 = .sbss:0x804BF678; // type:object size:0x4 data:4byte lbl_804BF67C = .sbss:0x804BF67C; // type:object size:0x4 data:4byte lbl_804BF680 = .sbss:0x804BF680; // type:object size:0x8 data:4byte -sSeed__11RPUtlRandom = .sbss:0x804BF688; // type:object size:0x4 align:4 data:4byte +sRandom__11RPUtlRandom = .sbss:0x804BF688; // type:object size:0x4 align:4 data:4byte lbl_804BF690 = .sbss:0x804BF690; // type:object size:0x4 data:4byte lbl_804BF694 = .sbss:0x804BF694; // type:object size:0x4 data:4byte lbl_804BF698 = .sbss:0x804BF698; // type:object size:0x8 data:4byte diff --git a/include/Pack/RPUtility/RPUtlRandom.h b/include/Pack/RPUtility/RPUtlRandom.h index e73fba7dc..21de0822a 100644 --- a/include/Pack/RPUtility/RPUtlRandom.h +++ b/include/Pack/RPUtility/RPUtlRandom.h @@ -11,12 +11,16 @@ class RPUtlRandom { * @brief Seeds the generator using the system clock */ static void initialize(); + void initRand(); /** * @brief Generates a random unsigned 32-bit integer */ static u32 getU32() { - return calc(); + return sRandom.getRandU32(); + } + u32 getRandU32() { + return calcRand(); } /** @@ -25,15 +29,21 @@ class RPUtlRandom { * @param max Upper bound (exclusive) */ static u32 getU32(u32 max) { - return max * getF32(); + return sRandom.getRandU32(max); + } + u32 getRandU32(u32 max) { + return max * getRandF32(); } /** * @brief Generates a random floating point value in the range [0, 1) */ static f32 getF32() { + return sRandom.getRandF32(); + } + f32 getRandF32() { // Limited to u16 bounds - u16 iRnd = static_cast(RANDF_MAX & (getU32() >> RANDF_SHIFT)); + u16 iRnd = static_cast(RANDF_MAX & (getRandU32() >> RANDF_SHIFT)); // Convert to float f32 fRnd = static_cast(iRnd); @@ -47,7 +57,10 @@ class RPUtlRandom { * @brief Advances the generator seed */ static u32 calc() { - return (sSeed = sSeed * MULT + 1); + return sRandom.calcRand(); + } + u32 calcRand() { + return (mSeed = mSeed * MULT + 1); } private: @@ -59,8 +72,11 @@ class RPUtlRandom { //! Bit shift amount for random floating point generation static const u32 RANDF_SHIFT; - //! Global generator seed - static u32 sSeed; + //! Global RNG + static RPUtlRandom sRandom; + + //! Generator seed + u32 mSeed; }; #endif diff --git a/src/Pack/RPUtility/RPUtlRandom.cpp b/src/Pack/RPUtility/RPUtlRandom.cpp index dca1d84f4..4d21ab422 100644 --- a/src/Pack/RPUtility/RPUtlRandom.cpp +++ b/src/Pack/RPUtility/RPUtlRandom.cpp @@ -2,7 +2,7 @@ #include -u32 RPUtlRandom::sSeed = 0; +RPUtlRandom RPUtlRandom::sRandom; const u32 RPUtlRandom::RANDF_MAX = 0xFFFF; const u32 RPUtlRandom::RANDF_SHIFT = 16; const u32 RPUtlRandom::MULT = 0x10DCD; @@ -11,12 +11,15 @@ const u32 RPUtlRandom::MULT = 0x10DCD; * @brief Creates a seed based off of the system time. */ void RPUtlRandom::initialize() { + sRandom.initRand(); +} +void RPUtlRandom::initRand() { s64 ticks = OSGetTime(); OSCalendarTime calTime; OSTicksToCalendarTime(ticks, &calTime); //! Maybe there's a macro for this? Might look a bit fake-matchy at the //! moment. - sSeed = (calTime.min << 26) | (calTime.sec << 20) | (calTime.msec << 10) | + mSeed = (calTime.min << 26) | (calTime.sec << 20) | (calTime.msec << 10) | calTime.usec; }