#define RRACE_GAME_H_
#include <inttypes.h>
+#include <xtime.h>
enum {
TILE_EMPTY,
TILE_MAX
};
-enum { GOAL_SHIFT = 6 };
+#define GOAL_SHIFT 6
+#define GOAL_MASK 0x739c0ul
+
struct board {
/*
* Bit planes representing the current game area.
* game[0] - least significant bit of the tile's colour.
* game[1] - tile colour.
* game[2] - most significant bit of the tile's colour.
- * game[3] - the board mask, all bits set except one indicating the
- * absense of a tile at this position.
+ * game[3] - No internal meaning. The game_reset function will clear
+ * the bit at the empty position and set all others, and
+ * game_do_move will adjust it.
*/
uint_least32_t game[4];
*/
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 */
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
* is now (x, y).
*
- * Returns 0 if the move was valid (and board has been updated), -1 otherwise.
+ * Returns the board bitmap indicating which positions changed. A return
+ * value of 0 therefore indicates an invalid move.
*/
-int game_do_move(struct board *board, int x, int y);
+uint_fast32_t 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
*/
void game_reset(struct board *board);
+/*
+ * Reset the game start time.
+ */
+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).
*/
-void game_finish(struct board *board);
+int_fast32_t game_finish(struct board *board);
#endif