X-Git-Url: http://git.draconx.ca/gitweb/rrace.git/blobdiff_plain/48cf657b615567153e5ed786b6034f9b46733f9a..ca97af514870895e228df0443adc5a16be4d9a78:/src/game.h diff --git a/src/game.h b/src/game.h index 176cb36..efa7ef0 100644 --- a/src/game.h +++ b/src/game.h @@ -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).