aboutsummaryrefslogtreecommitdiff
path: root/src/gunner/rand_sys.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gunner/rand_sys.c')
-rw-r--r--src/gunner/rand_sys.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/gunner/rand_sys.c b/src/gunner/rand_sys.c
new file mode 100644
index 0000000..ffd2a25
--- /dev/null
+++ b/src/gunner/rand_sys.c
@@ -0,0 +1,41 @@
+typedef struct _FILETIME {
+ u32 dwLowDateTime;
+ u32 dwHighDateTime;
+} FILETIME;
+
+#define W32(r) __declspec(dllimport) r __stdcall
+W32(void) GetSystemTimeAsFileTime(FILETIME *);
+
+static u32 state[2];
+
+void rand_seed(void)
+{
+ FILETIME t;
+ GetSystemTimeAsFileTime(&t);
+
+ u32 val = t.dwLowDateTime;
+ val ^= val >> 16;
+ val *= 0x85ebca6b;
+ val ^= val >> 13;
+ val *= 0xc2b2ae35;
+ val ^= val >> 16;
+
+ state[0] = val;
+ state[1] = val ^ 0x49616e42U;
+}
+
+u32 rand_u32(void)
+{
+ state[0] = (state[0] << 16) + (state[0] >> 16);
+ state[0] += state[1];
+ state[1] += state[0];
+ return state[0];
+}
+
+i32 rand_range(i32 min, i32 max)
+{
+ u32 range = (u32)(max - min + 1);
+ u32 num = rand_u32() % range;
+
+ return min + (i32)num;
+} \ No newline at end of file