diff options
Diffstat (limited to 'src/random.c')
-rw-r--r-- | src/random.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/random.c b/src/random.c new file mode 100644 index 0000000..5db7394 --- /dev/null +++ b/src/random.c @@ -0,0 +1,49 @@ +#include "global.h" + +extern s32 gRngState; + +void SeedRng(u8 *seed) +{ + gRngState = 54021 + (seed[0] * seed[1]) + (seed[2] * seed[3]) + (seed[4] * seed[5]); +} + +static s16 Random16(void) +{ + gRngState = 1566083941 * gRngState + 1; + return gRngState >> 16; +} + +s32 Random(void) +{ + s32 r1 = Random16(); + s32 r2 = Random16(); + return (r1 << 16) | r2; +} + +// Returns a random number in the range [0, cap). +s32 RandomCapped(s32 cap) +{ + return (((Random() & 0xFFFF) * cap) >> 16) & 0xFFFF; +} + +s32 RandomRange(s32 a, s32 b) +{ + if (a == b) + return a; + + if (a < b) + return RandomCapped(b - a) + a; + + return RandomCapped(a - b) + b; +} + +s32 GetRngState(void) +{ + return gRngState; +} + +void SetRngState(s32 state) +{ + gRngState = state; + gRngState = Random(); +} |