summaryrefslogtreecommitdiff
path: root/src/random.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/random.c')
-rw-r--r--src/random.c49
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();
+}