]> git.draconx.ca Git - rrace.git/blobdiff - src/game.h
motif: State structure cleanup
[rrace.git] / src / game.h
index 176cb367a51e18671a5a8315961a0cda92658bb2..efa7ef0fc95d229d1d045bde9ab45dce19348db4 100644 (file)
@@ -35,6 +35,7 @@ enum {
 
 #define GOAL_SHIFT 6
 #define GOAL_MASK 0x739c0ul
+#define GAME_MASK 0x1fffffful
 
 struct board {
        /*
@@ -121,9 +122,7 @@ static inline uint_fast32_t board_mask_v(int x, int y0, int y1)
  */
 static inline uint_fast32_t board_above(int y)
 {
-       uint_fast32_t val = board_row(y);
-
-       return val | (val-1);
+       return ( 0x20ul << 5*y ) - 1;
 }
 
 /*
@@ -131,9 +130,7 @@ static inline uint_fast32_t board_above(int y)
  */
 static inline uint_fast32_t board_below(int y)
 {
-       uint_fast32_t val = board_row(y);
-
-       return val | (~val + 1);
+       return ~( 1ul << 5*y ) + 1;
 }
 
 /*
@@ -156,6 +153,31 @@ static inline uint_fast32_t board_right(int x)
        return ~val + 0x108421;
 }
 
+/*
+ * Return the board bitmap setting the rectangle of locations that are:
+ *
+ *   - on or right of column x1, and
+ *   - on or left of column x2, and
+ *   - on or below row y1, and
+ *   - on or above row y2.
+ *
+ * It must be the case that x2 >= x1 and y2 >= y1.
+ */
+static inline uint_fast32_t board_rect(int x1, int y1, int x2, int y2)
+{
+       return (board_left(x2-x1) << x1) & (board_above(y2-y1) << 5*y1);
+}
+
+/*
+ * Extract the tile colour from a specific position of one of the
+ * arrays of tile bitmaps.  The position is a bit index.  So for
+ * example, game the tile at a given (x, y) position can be extracted
+ * by board_tile(board.game, 5*y+x).
+ */
+#define board_tile(planes, bit) (((0[planes]<<0) >> (bit)) & 1) \
+                              | (((1[planes]<<1) >> (bit)) & 2) \
+                              | (((2[planes]<<2) >> (bit)) & 4)
+
 /*
  * 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
@@ -188,6 +210,11 @@ void game_reset(struct board *board);
  */
 void game_begin(struct board *board);
 
+/*
+ * Return the total elapsed time (in ms) since the last call to game_begin.
+ */
+int_fast32_t game_elapsed(struct board *board);
+
 /*
  * Disable new moves and clear all tile bits other than the 9 goal tiles.
  * Returns the total elapsed time (in ms).