#include <limits.h>
#include <string.h>
#include <time.h>
+#include <gethrxtime.h>
#include "game.h"
#define B64(x) ((x) & 0xffffffffffffffff)
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;
return 0;
}
-#define GOAL_MASK 0x739c0
-
-int game_check_goal(struct board *board)
+uint_fast32_t game_check_goal(struct board *board)
{
- int i, ret = 1;
+ uint_least32_t *game = board->game;
+ uint_least16_t *goal = board->goal;
+ uint_least32_t mask = 0;
+ int i;
for (i = 0; i < 3; i++)
- ret &= ((board->game[i] & GOAL_MASK) >> 6) == board->goal[i];
- return ret;
+ mask |= goal[i] ^ (game[i] >> GOAL_SHIFT);
+ return (mask << GOAL_SHIFT) & GOAL_MASK;
}
-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++) {
* disable the game since there will be no valid moves.
*/
board->x = board->y = -1;
+
+ return t;
}