]> git.draconx.ca Git - rrace.git/blobdiff - src/game.h
Only redraw changed tiles when right clicking.
[rrace.git] / src / game.h
index fb2fe9767135e8bfe97bab3cf2bfe46ab035a9a3..a734e229058f5182f96c28c3512c19c06fec6965 100644 (file)
@@ -20,6 +20,7 @@
 #define RRACE_GAME_H_
 
 #include <inttypes.h>
+#include <xtime.h>
 
 enum {
        TILE_EMPTY,
@@ -32,7 +33,9 @@ enum {
        TILE_MAX
 };
 
-enum { GOAL_SHIFT = 6 };
+#define GOAL_SHIFT 6
+#define GOAL_MASK 0x739c0ul
+
 struct board {
        /*
         * Bit planes representing the current game area.
@@ -63,8 +66,10 @@ struct board {
         */
        uint_least16_t goal[3];
 
-       /* (x, y) position of the current empty position. */
+       /* (x, y) position of the current empty space. */
        uint_least8_t x, y;
+
+       xtime_t time_start;
 };
 
 /* Return the board bitmap with all bits in column x set */
@@ -111,6 +116,46 @@ static inline uint_fast32_t board_mask_v(int x, int y0, int y1)
        return (col << 5*y1) & (col >> 5*(4-y0));
 }
 
+/*
+ * Return the board bitmap setting locations on or above row y.
+ */
+static inline uint_fast32_t board_above(int y)
+{
+       uint_fast32_t val = board_row(y);
+
+       return val | (val-1);
+}
+
+/*
+ * Return the board bitmap setting locations on or below row y.
+ */
+static inline uint_fast32_t board_below(int y)
+{
+       uint_fast32_t val = board_row(y);
+
+       return val | (~val + 1);
+}
+
+/*
+ * Return the board bitmap setting locations on or left of column x.
+ */
+static inline uint_fast32_t board_left(int x)
+{
+       uint_fast32_t val = board_column(x);
+
+       return val | (val - 0x108421);
+}
+
+/*
+ * Return the board bitmap setting locations on or right of column x.
+ */
+static inline uint_fast32_t board_right(int x)
+{
+       uint_fast32_t val = board_column(x);
+
+       return ~val + 0x108421;
+}
+
 /*
  * Move the bits in the game bitmaps according to a move at position (x, y),
  * and update the location of the empty position which, if the move was valid
@@ -121,9 +166,10 @@ static inline uint_fast32_t board_mask_v(int x, int y0, int y1)
 int game_do_move(struct board *board, int x, int y);
 
 /*
- * Returns 1 if the game is in a winning position, or 0 otherwise.
+ * Returns the board bitmap setting game locations that differ from the goal.
+ * A return value of 0 therefore indicates a winning position.
  */
-int game_check_goal(struct board *board);
+uint_fast32_t game_check_goal(struct board *board);
 
 /*
  * Initialize the game RNG such that the next call to game_reset will produce a
@@ -136,9 +182,15 @@ void game_reseed(unsigned long long seed);
  */
 void game_reset(struct board *board);
 
+/*
+ * Reset the game start time.
+ */
+void game_begin(struct board *board);
+
 /*
  * Disable new moves and clear all tile bits other than the 9 goal tiles.
+ * Returns the total elapsed time (in ms).
  */
-void game_finish(struct board *board);
+int_fast32_t game_finish(struct board *board);
 
 #endif