src/chess/rules.h

changeset 129
189c7c77aaab
parent 122
e65d9b5e9324
child 130
3fc6b1d6cbe9
--- a/src/chess/rules.h	Tue May 26 15:29:00 2026 +0200
+++ b/src/chess/rules.h	Thu May 28 12:15:26 2026 +0200
@@ -30,8 +30,6 @@
 #ifndef RULES_H
 #define	RULES_H
 
-#include "game-info.h"
-
 #include <stdint.h>
 #include <stdbool.h>
 
@@ -48,6 +46,94 @@
 
 #define ENPASSANT_THREAT 0x40
 
+#define WHITE 0x10
+#define BLACK 0x20
+#define opponent_color(color) ((color)==WHITE?BLACK:WHITE)
+
+#define PIECE_MASK 0x0F
+#define COLOR_MASK 0x30
+
+#define PAWN   0x01
+#define ROOK   0x02
+#define KNIGHT 0x03
+#define BISHOP 0x04
+#define QUEEN  0x05
+#define KING   0x06
+
+#define WPAWN   (WHITE|PAWN)
+#define WROOK   (WHITE|ROOK)
+#define WKNIGHT (WHITE|KNIGHT)
+#define WBISHOP (WHITE|BISHOP)
+#define WQUEEN  (WHITE|QUEEN)
+#define WKING   (WHITE|KING)
+#define BPAWN   (BLACK|PAWN)
+#define BROOK   (BLACK|ROOK)
+#define BKNIGHT (BLACK|KNIGHT)
+#define BBISHOP (BLACK|BISHOP)
+#define BQUEEN  (BLACK|QUEEN)
+#define BKING   (BLACK|KING)
+
+typedef uint8_t Board[8][8];
+
+struct movetimeval {
+    uint64_t tv_sec;
+    int32_t tv_usec;
+};
+
+typedef struct {
+    uint8_t piece;
+    uint8_t fromfile;
+    uint8_t fromrow;
+    uint8_t tofile;
+    uint8_t torow;
+    uint8_t promotion;
+    uint8_t check;
+    uint8_t capture;
+    struct movetimeval timestamp;
+    struct movetimeval movetime;
+    char string[8];
+} Move;
+
+typedef struct {
+    uint8_t servercolor;
+    uint8_t timecontrol;
+    uint16_t time;
+    uint16_t addtime;
+} GameInfo;
+
+/** The buffer length for player names in GameInfo structures. */
+#define PLAYER_NAME_BUFLEN 32
+
+typedef struct {
+    Board board;
+    Move* moves;
+    /** optional name of the white player */
+    char wname[PLAYER_NAME_BUFLEN];
+    /** optional name of the black player */
+    char bname[PLAYER_NAME_BUFLEN];
+    /** capacity of the move array */
+    unsigned movecapacity;
+    /** number of (half-)moves (counting BOTH colors) */
+    unsigned int movecount;
+    /** a premove that shall be evaluated next time it's our turn */
+    char premove[8];
+    bool checkmate;
+    bool stalemate;
+    bool remis;
+    bool wresign;
+    bool bresign;
+    /** this flag is only supposed to be set when the opponent disconnects */
+    bool ragequit;
+    bool review;
+} GameState;
+
+#define is_game_running(gamestate) !((gamestate)->checkmate || \
+    (gamestate)->wresign || (gamestate)->bresign || \
+    (gamestate)->stalemate || (gamestate)->remis || (gamestate)->review)
+
+#define last_move(gamestate) \
+    ((gamestate)->moves[(gamestate)->movecount-1])
+
 #define POS_UNSPECIFIED UINT8_MAX
 #define mdst(b,m) b[(m)->torow][(m)->tofile]
 #define msrc(b,m) b[(m)->fromrow][(m)->fromfile]
@@ -71,6 +157,19 @@
 #define fileidx_s(c) (isfile(c)?fileidx(c):POS_UNSPECIFIED)
 #define rowidx_s(c) (isrow(c)?rowidx(c):POS_UNSPECIFIED)
 
+
+/**
+ * Initializes a game state and prepares the chess board.
+ * @param gamestate the game state to initialize
+ */
+void gamestate_init(GameState *gamestate);
+
+/**
+ * Cleans up a game state and frees the memory for the movement list.
+ * @param gamestate the game state to clean up
+ */
+void gamestate_cleanup(GameState *gamestate);
+
 /**
  * Maps a character to a piece.
  * 

mercurial