]> git.draconx.ca Git - rrace.git/blobdiff - src/game.h
Fix distribution of copysym.h.
[rrace.git] / src / game.h
index 7640b415d0bd6aba2c67f98bd3692439f556c43c..56fb4427fcc18abb2b3d99abdfe98006b7143fbd 100644 (file)
@@ -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