From 7b31fcfac507ebddcf9d433e608f9cc5ab3cfa80 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Tue, 14 Oct 2025 12:06:06 +0100 Subject: [PATCH] Create RNG module --- build.sh | 2 +- game.c | 14 ++------------ main.c | 3 +++ rng.c | 32 ++++++++++++++++++++++++++++++++ rng.h | 12 ++++++++++++ 5 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 rng.c create mode 100644 rng.h diff --git a/build.sh b/build.sh index 1f5b8c7..53faf61 100755 --- a/build.sh +++ b/build.sh @@ -8,4 +8,4 @@ defs="-D_POSIX_C_SOURCE=200809L" $cc $warn $flags $libs $defs \ -o asteroids \ - fb.c game.c input.c main.c maths.c renderer.c + fb.c game.c input.c main.c maths.c renderer.c rng.c diff --git a/game.c b/game.c index 79f46c5..99dc86c 100644 --- a/game.c +++ b/game.c @@ -2,12 +2,11 @@ #include "input.h" #include "renderer.h" +#include "rng.h" #include #include -#include #include -#include #define FIRE_MEAN -0.15 #define FIRE_JITTER 0.01 @@ -204,11 +203,6 @@ static void remove_entity(unsigned id) --entity_count; } -static float rand_plusminus() -{ - return 2.0f * ((float)rand() / RAND_MAX - 0.5f); -} - static void ship_update() { entity_t *ship = entities + ship_entity_id; @@ -221,7 +215,7 @@ static void ship_update() shape_t *fire = shapes + fire_shape_id; fire->visible = input.fwd != 0; - fire->verts[0].y = FIRE_MEAN + FIRE_JITTER * rand_plusminus(); + fire->verts[0].y = FIRE_MEAN + FIRE_JITTER * rng_plusminus(); } void game_init(float _aspect) @@ -230,10 +224,6 @@ void game_init(float _aspect) input_on_release(key_release_callback); input_on_repeat(key_repeat_callback); - struct timeval tv; - gettimeofday(&tv, NULL); - srand(tv.tv_usec); - aspect = _aspect; quit = false; diff --git a/main.c b/main.c index b36539d..09d81aa 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,7 @@ #include "game.h" #include "input.h" #include "renderer.h" +#include "rng.h" #include #include @@ -9,6 +10,8 @@ int main() { + rng_init(); + const int input_fd = input_init(); const renderer_params_t renderer_params = renderer_init(); diff --git a/rng.c b/rng.c new file mode 100644 index 0000000..6ab3a46 --- /dev/null +++ b/rng.c @@ -0,0 +1,32 @@ +#include "rng.h" + +#include +#include + +static uint32_t state; + +void rng_init() +{ + struct timeval tv; + const int res = gettimeofday(&tv, nullptr); + assert(res == 0); + state = tv.tv_usec; +} + +uint32_t rng_uint32() +{ + state ^= state << 13; + state ^= state >> 17; + state ^= state << 5; + return state; +} + +float rng_canon() +{ + return (float)rng_uint32() / UINT32_MAX; +} + +float rng_plusminus() +{ + return 2.0 * rng_canon() - 1.0; +} diff --git a/rng.h b/rng.h new file mode 100644 index 0000000..dc0daaf --- /dev/null +++ b/rng.h @@ -0,0 +1,12 @@ +#ifndef RNG_H +#define RNG_H + +#include + +void rng_init(); + +uint32_t rng_uint32(); +float rng_canon(); +float rng_plusminus(); + +#endif