X-Git-Url: https://git.draconx.ca/gitweb/rrace.git/blobdiff_plain/a3f2189bfac7e5b1acdf3640cd3b50a7a6636906..ec2e7b448d7d0d404c0b3102c5b25ac9464d9fc5:/src/game.c diff --git a/src/game.c b/src/game.c index ca03830..c478eef 100644 --- a/src/game.c +++ b/src/game.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "game.h" #define B64(x) ((x) & 0xffffffffffffffff) @@ -123,8 +124,15 @@ void game_reset(struct board *board) unsigned char tiles[25]; unsigned i; - if (!rng_is_seeded()) - game_reseed(time(NULL)); + if (!rng_is_seeded()) { + unsigned long long seed; + + seed = time(NULL); + seed += gethrxtime(); + seed += seed << 32; + + game_reseed(seed); + } for (i = 0; i < 24; i++) { tiles[i] = (i%6) + 1; @@ -134,34 +142,28 @@ void game_reset(struct board *board) memset(board->goal, 0, sizeof board->goal); for (i = 0; i < 9; i++) { - uint_fast32_t position = board_position(i/3+1, i%3+1); - - if (tiles[i] & 1) - board->goal[0] |= position >> 6; - if (tiles[i] & 2) - board->goal[1] |= position >> 6; - if (tiles[i] & 4) - board->goal[2] |= position >> 6; + uint_fast32_t position = board_position(i/3+1, i%3+1) >> 6; + + if (tiles[i] & 1) board->goal[0] |= position; + if (tiles[i] & 2) board->goal[1] |= position; + if (tiles[i] & 4) board->goal[2] |= position; } tiles[24] = TILE_EMPTY; shuffle(tiles, 25); - memset(board->game, 0, sizeof board->game); + memset(board->game, 0, sizeof board->game); for (i = 0; i < 25; i++) { unsigned x = i/5, y = i%5; uint_fast32_t position; position = board_position(x, y); if (tiles[i] != TILE_EMPTY) { - if (tiles[i] & 1) - board->game[0] |= position; - if (tiles[i] & 2) - board->game[1] |= position; - if (tiles[i] & 4) - board->game[2] |= position; + if (tiles[i] & 1) board->game[0] |= position; + if (tiles[i] & 2) board->game[1] |= position; + if (tiles[i] & 4) board->game[2] |= position; } else { - board->game[3] = 0x1ffffff ^ position; + board->game[3] = ~position; board->x = x; board->y = y; } @@ -197,8 +199,6 @@ int game_do_move(struct board *board, int x, int y) return 0; } -#define GOAL_MASK 0x739c0 - int game_check_goal(struct board *board) { int i, ret = 1; @@ -208,8 +208,19 @@ int game_check_goal(struct board *board) return ret; } -void game_finish(struct board *board) +void game_begin(struct board *board) { + board->time_start = gethrxtime(); +} + +static int_fast32_t elapsed(struct board *board) +{ + return (gethrxtime() - board->time_start) / 1000000; +} + +int_fast32_t game_finish(struct board *board) +{ + int_fast32_t t = elapsed(board); int i; for (i = 0; i < 4; i++) { @@ -221,4 +232,6 @@ void game_finish(struct board *board) * disable the game since there will be no valid moves. */ board->x = board->y = -1; + + return t; }