--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/chess/game-info.h Mon Jun 02 19:40:24 2025 +0200 @@ -0,0 +1,124 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2016 Mike Becker. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GAME_INFO_H +#define GAME_INFO_H + +#include <stdint.h> + +#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 MoveList MoveList; + +struct MoveList { + Move move; + MoveList* next; +}; + +typedef struct { + uint8_t servercolor; + uint8_t timecontrol; + uint16_t time; + uint16_t addtime; +} GameInfo; + +typedef struct { + Board board; + MoveList* movelist; + MoveList* lastmove; + unsigned int movecount; /* number of (half-)moves (counting BOTH colors) */ + _Bool checkmate; + _Bool stalemate; + _Bool remis; + _Bool resign; +} GameState; + + +#define is_game_running(gamestate) !((gamestate)->checkmate || \ + (gamestate)->resign || (gamestate)->stalemate || (gamestate)->remis) + +/** + * 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); + +#endif