X-Git-Url: http://git.draconx.ca/gitweb/rrace.git/blobdiff_plain/777611df8df4522752b3a85a14523f18bf695a0f..b4b5688edd332e17591ca7bc1cdd64c296abe1c5:/src/game.h diff --git a/src/game.h b/src/game.h index 7640b41..56fb442 100644 --- a/src/game.h +++ b/src/game.h @@ -1,6 +1,6 @@ /* * Slide puzzle core game logic - * Copyright © 2022 Nick Bowler + * Copyright © 2022-2023 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,6 +35,7 @@ enum { #define GOAL_SHIFT 6 #define GOAL_MASK 0x739c0ul +#define GAME_MASK 0x1fffffful struct board { /* @@ -167,6 +168,16 @@ 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 @@ -210,4 +221,21 @@ int_fast32_t game_elapsed(struct board *board); */ int_fast32_t game_finish(struct board *board); +/* + * Constructs a new set of game bitmaps into buf, with tiles in the + * objective area replaced by the goal tile colours, and returns buf. + */ +static inline uint_least32_t * +game_overlay_goal(struct board *board, uint_least32_t *buf) +{ + int i; + + for (i = 0; i < 3; i++) { + buf[i] = (unsigned long)board->goal[i] << GOAL_SHIFT; + buf[i] = (buf[i] & GOAL_MASK) | (board->game[i] & ~GOAL_MASK); + } + + return buf; +} + #endif