--- 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. *