Skip to content

Commit 5397860

Browse files
authored
Randomness and nightmode improvements (#3)
* Bug fixes and general improvements * Fixed moving stars and moon during gameover on nightmode * Fixed invalid obstacle gaps * Improved random value generation in interval + Added `dinorunner_seed()` for variance in random values * Updated docs * Bump version to 1.3.2 * Bump versions in CMakefiles for up-coming release
1 parent 234c5e4 commit 5397860

File tree

11 files changed

+35
-26
lines changed

11 files changed

+35
-26
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ unsigned char dinorunner_update(struct dinorunner_s* dinorunner);
8181
unsigned char dinorunner_getversion(struct version_s* version);
8282
unsigned char dinorunner_isinverted(const struct dinorunner_s* dinorunner, unsigned char* night_mode);
8383
unsigned char dinorunner_isalive(const struct dinorunner_s* dinorunner, unsigned char* activation_status);
84+
void dinorunner_seed(unsigned short random_seed);
8485
void dinorunner_onkeyup(struct dinorunner_s* dinorunner);
8586
void dinorunner_onkeydown(struct dinorunner_s* dinorunner);
8687
void dinorunner_onkeynone(struct dinorunner_s* dinorunner);

demo/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.10)
22

33
project(dinorunner-demos
4-
VERSION 1.3.1
4+
VERSION 1.3.2
55
DESCRIPTION "Running examples of the Dinorunner libray"
66
LANGUAGES C CXX)
77

demo/sdl/demo.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <stdio.h>
1616
#include <stdlib.h>
1717
#include <string.h>
18+
#include <time.h>
1819
#include "dinorunner.h"
1920

2021
#define LOG(format, ...) fprintf(stderr, "[%24s(%3d)] " format "\n", __FUNCTION__, __LINE__, __VA_ARGS__)
@@ -122,9 +123,6 @@ static uint8_t render_background(hypervisor_s* hypervisor) {
122123
int status;
123124
status = SDL_RenderClear(hypervisor->g_renderer);
124125
status = SDL_SetRenderDrawColor(hypervisor->g_renderer, 0xFF, 0xFF, 0xFF, SDL_ALPHA_OPAQUE);
125-
// status = SDL_SetRenderDrawColor(hypervisor->g_renderer, kBackgroundColor, kBackgroundColor, kBackgroundColor,
126-
// SDL_ALPHA_OPAQUE);
127-
// SDL_RenderFillRect(hypervisor->g_renderer, &game_rect);
128126
SDL_assert(status == 0);
129127
SDL_RenderFillRect(hypervisor->g_renderer, NULL);
130128
SDL_RenderPresent(hypervisor->g_renderer);
@@ -353,6 +351,7 @@ static uint8_t system_init(hypervisor_s* hypervisor) {
353351
load_scorefile(hypervisor);
354352
SDL_initFramerate(&hypervisor->fps_manager);
355353
SDL_setFramerate(&hypervisor->fps_manager, kFrameRate);
354+
dinorunner_seed((unsigned short)time(NULL));
356355
status = dinorunner_init(&hypervisor->dinorunner, &kGameDimension, hypervisor);
357356
return status;
358357
}

dinorunner/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.10)
33
cmake_policy(PUSH)
44

55
project(dinorunner
6-
VERSION 1.3.1
6+
VERSION 1.3.2
77
DESCRIPTION "Chrome's Dino game in C"
88
LANGUAGES C)
99

dinorunner/include/dinorunner.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,13 @@ void dinorunner_onkeydown(struct dinorunner_s* dinorunner);
594594
*/
595595
void dinorunner_onkeynone(struct dinorunner_s* dinorunner);
596596

597+
/**
598+
* @brief Reinitialize pseudo-random value generator start value
599+
*
600+
* @param random_seed Start value to reinitialize with
601+
*/
602+
void dinorunner_seed(unsigned short random_seed);
603+
597604
/**
598605
* @defgroup Internal functions
599606
* Used internally by the dinorunner routines
@@ -640,7 +647,7 @@ unsigned char dinorunner_distancemeter_update(struct distance_meter_s* distance_
640647
void dinorunner_nightmode_init(struct nightmode_s* nightmode, unsigned width);
641648
void dinorunner_nightmode_reset(struct nightmode_s* nightmode, unsigned container_width, void* user_data);
642649
unsigned char dinorunner_nightmode_update(struct nightmode_s* nightmode, unsigned char show_nightmode,
643-
unsigned container_width, void* user_data);
650+
unsigned container_width, float current_speed, void* user_data);
644651

645652
unsigned char dinorunner_trex_init(struct trex_s* trex, unsigned container_width, unsigned container_height,
646653
void* user_data);

dinorunner/src/dinorunner.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ unsigned char dinorunner_init(struct dinorunner_s* dinorunner, const struct dime
3939
dinorunner->user_data = user_data;
4040
dinorunner->inverted = 0u;
4141
res &= dinorunner_horizon_init(&dinorunner->horizon, &dinorunner->dimension,
42-
-DINORUNNER_CONFIG_HORIZON_GAP_COEFFICIENT, dinorunner->user_data);
42+
DINORUNNER_CONFIG_HORIZON_GAP_COEFFICIENT, dinorunner->user_data);
4343
res &= dinorunner_trex_init(&dinorunner->trex, dimension->width, dimension->height, dinorunner->user_data);
4444
res &= dinorunner_gameoverpanel_init(&dinorunner->gameoverpanel, dimension);
4545
res &= dinorunner_distancemeter_init(&dinorunner->distance_meter, &text_dimension, dimension->width,

dinorunner/src/horizon.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ unsigned char dinorunner_horizon_update(struct horizon_s* horizon, float delta_t
162162
void* user_data) {
163163
horizon->running_time += delta_time;
164164
dinorunner_horizonline_update(&horizon->horizon_line, delta_time, current_speed, user_data);
165-
dinorunner_nightmode_update(&horizon->nightmode, show_night_mode, horizon->dimension.width, user_data);
165+
dinorunner_nightmode_update(&horizon->nightmode, show_night_mode, horizon->dimension.width, current_speed, user_data);
166166
update_clouds(horizon, delta_time, current_speed, user_data);
167167
if (update_obstacles_request) {
168168
update_obstacles(horizon, delta_time, current_speed, user_data);

dinorunner/src/nightmode.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88

99
#include "dinorunner.h"
1010

11-
static float dinorunner_nightmode_updateXPos(float current_pos, float speed, unsigned container_width) {
11+
static float dinorunner_nightmode_updateXPos(float current_pos, float speed, unsigned container_width,
12+
float runner_speed) {
1213
if (current_pos < -DINORUNNER_CONFIG_NIGHTMODE_WIDTH) {
1314
current_pos = container_width;
14-
} else {
15+
} else if (runner_speed != 0) {
1516
current_pos -= speed;
1617
}
1718
return current_pos;
@@ -56,7 +57,7 @@ void dinorunner_nightmode_init(struct nightmode_s* nightmode, unsigned container
5657
}
5758

5859
unsigned char dinorunner_nightmode_update(struct nightmode_s* nightmode, unsigned char show_nightmode,
59-
unsigned container_width, void* user_data) {
60+
unsigned container_width, float current_speed, void* user_data) {
6061
if (show_nightmode && nightmode->opacity == 0) {
6162
nightmode->current_phase++;
6263
if (nightmode->current_phase >= DINORUNNER_CONFIG_NIGHTMODE_MOONPHASES) {
@@ -71,12 +72,12 @@ unsigned char dinorunner_nightmode_update(struct nightmode_s* nightmode, unsigne
7172
nightmode->opacity -= DINORUNNER_CONFIG_NIGHTMODE_FADESPEED;
7273
}
7374
if (nightmode->opacity > 0) {
74-
nightmode->x_pos =
75-
dinorunner_nightmode_updateXPos(nightmode->x_pos, DINORUNNER_CONFIG_NIGHTMODE_MOONSPEED, container_width);
75+
nightmode->x_pos = dinorunner_nightmode_updateXPos(nightmode->x_pos, DINORUNNER_CONFIG_NIGHTMODE_MOONSPEED,
76+
container_width, current_speed);
7677
if (nightmode->draw_stars) {
7778
for (unsigned i = 0; i < DINORUNNER_CONFIG_NIGHTMODE_NUMBSTARS; ++i) {
7879
nightmode->stars[i].x = dinorunner_nightmode_updateXPos(
79-
nightmode->stars[i].x, (float)DINORUNNER_CONFIG_NIGHTMODE_STARSPEED, container_width);
80+
nightmode->stars[i].x, (float)DINORUNNER_CONFIG_NIGHTMODE_STARSPEED, container_width, current_speed);
8081
}
8182
}
8283
dinorunner_nightmode_draw(nightmode, user_data);
@@ -91,5 +92,5 @@ unsigned char dinorunner_nightmode_update(struct nightmode_s* nightmode, unsigne
9192
void dinorunner_nightmode_reset(struct nightmode_s* nightmode, unsigned container_width, void* user_data) {
9293
nightmode->current_phase = 0;
9394
nightmode->opacity = 0;
94-
dinorunner_nightmode_update(nightmode, 0, container_width, user_data);
95+
dinorunner_nightmode_update(nightmode, 0, container_width, 0, user_data);
9596
}

dinorunner/src/obstacle.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@ static void obstacle_draw(const struct obstacle_s* obstacle, void* user_data) {
154154
void dinorunner_obstacle_init(struct obstacle_s* obstacle, enum obstacle_type_e obstacle_type,
155155
const struct dimension_s* dimension, float gap_coefficient, float speed, int opt_x_offset,
156156
void* user_data) {
157-
TREX_UNUSED(gap_coefficient);
158157
obstacle->y_pos = 0;
159158
obstacle->width = 0;
160159
obstacle->gap = 0;
@@ -173,7 +172,7 @@ void dinorunner_obstacle_init(struct obstacle_s* obstacle, enum obstacle_type_e
173172
obstacle->gap = 0u;
174173
obstacle->timer = 0u;
175174
obstacle->following_obstacle_created = 0u;
176-
obstacle->gap_coefficient = DINORUNNER_CONFIG_MAX_GAP_COEFFICIENT;
175+
obstacle->gap_coefficient = gap_coefficient;
177176
if (obstacle->size > 1 && (obstacle->config.multiple_speed > speed)) {
178177
obstacle->size = 1;
179178
}

dinorunner/src/utils.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,18 @@ unsigned dinorunner_rand(void) {
8484

8585
float dinorunner_srand(void) {
8686
unsigned rand = dinorunner_rand();
87-
return (float)rand / 0xFFFF;
87+
return (float)rand / (unsigned short)(-1);
8888
}
8989

9090
unsigned dinorunner_getrandomnumb(unsigned min_value, unsigned max_value) {
91-
unsigned value = dinorunner_rand();
92-
value %= (max_value + 1);
93-
if (value >= max_value) {
94-
value = max_value;
95-
} else if (value <= min_value) {
96-
value = min_value;
91+
float random_value = dinorunner_srand();
92+
if (min_value > max_value) {
93+
min_value = max_value;
9794
}
98-
return value;
95+
unsigned interval = max_value - min_value;
96+
return min_value + dinorunner_roundf(random_value * interval);
9997
}
98+
99+
void dinorunner_seed(unsigned short random_seed) {
100+
lfsr = random_seed;
101+
}

0 commit comments

Comments
 (0)