Files
ad_fun/chessstars/internal/engine/engine.h
T
2026-07-15 13:29:08 +03:00

100 lines
2.1 KiB
C

#ifndef CHESSSTARS_ENGINE_H
#define CHESSSTARS_ENGINE_H
#include <stdint.h>
#define BOARD_SQUARES 64
#define MAX_HISTORY 120
#define PIECE_NONE 0
#define PIECE_PAWN 1
#define PIECE_KNIGHT 2
#define PIECE_BISHOP 3
#define PIECE_ROOK 4
#define PIECE_QUEEN 5
#define PIECE_KING 6
#define PIECE_COLOR_BIT 0x08
#define COLOR_WHITE 0
#define COLOR_BLACK 1
#define CASTLE_WK 0x01
#define CASTLE_WQ 0x02
#define CASTLE_BK 0x04
#define CASTLE_BQ 0x08
#define RULE_DISABLE_CASTLING 0x01
#define RULE_DISABLE_EN_PASSANT 0x02
#define RULE_IGNORE_CHECK 0x04
#define STATUS_ONGOING 0
#define STATUS_WHITE_WINS 1
#define STATUS_BLACK_WINS 2
#define STATUS_STALEMATE 3
typedef struct {
uint8_t from;
uint8_t to;
uint8_t piece;
uint8_t flags;
uint8_t captured;
uint8_t promo;
uint8_t reserved0;
uint8_t reserved1;
} Move;
#define MOVE_FLAG_CAPTURE 0x01
#define MOVE_FLAG_CASTLE_K 0x02
#define MOVE_FLAG_CASTLE_Q 0x04
#define MOVE_FLAG_EN_PASSANT 0x08
#define MOVE_FLAG_PROMOTION 0x10
typedef struct Engine Engine;
typedef int (*ValidateFn)(Engine *e, Move m);
typedef int (*LogFn)(const char *fmt, ...);
struct Engine {
uint32_t rule_flags;
int32_t halfmove_clock;
int32_t fullmove_number;
uint8_t board[BOARD_SQUARES];
uint8_t turn;
uint8_t castling_rights;
int8_t ep_square;
uint8_t variant;
Move history[MAX_HISTORY];
ValidateFn validate_move;
int32_t history_count;
char game_id[40];
uint8_t _reserved0[28];
LogFn log_fn;
};
#define ENGINE_LOG_SLOT 130
#define VARIANT_STANDARD 0
#define VARIANT_RELAXED 1
Engine *engine_new(int variant, const char *fen, uint32_t rule_flags, const char *game_id);
void engine_free(Engine *e);
int engine_add_move(Engine *e, Move m);
int engine_is_legal(Engine *e, Move m);
int engine_get_move_at(Engine *e, int32_t index, Move *out);
int32_t engine_history_count(Engine *e);
void engine_get_board(Engine *e, uint8_t out[BOARD_SQUARES]);
int engine_turn(Engine *e);
int engine_status(Engine *e);
int engine_in_check(Engine *e);
Move engine_bot_move(Engine *e, int depth);
int engine_import_replay(Engine *e, const Move *moves, int32_t count);
#endif