151 lines
4.4 KiB
C
151 lines
4.4 KiB
C
/* chessdefs.h - generic/catchall chess definitions.
|
|
*
|
|
* Copyright (C) 2021-2024 Bruno Raoult ("br")
|
|
* Licensed under the GNU General Public License v3.0 or later.
|
|
* Some rights reserved. See COPYING.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with this
|
|
* program. If not, see <https://www.gnu.org/licenses/gpl-3.0-standalone.html>.
|
|
*
|
|
* SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
|
|
*
|
|
*/
|
|
|
|
#ifndef _CHESSDEFS_H
|
|
#define _CHESSDEFS_H
|
|
|
|
#include <brlib.h> /* brlib types */
|
|
|
|
#define U64(const_u64) const_u64##UL
|
|
#define BIT(i) ( U64(1) << (i) )
|
|
#define BIT_NONE ( U64(0) )
|
|
#define BIT_ALL ( ~BIT_NONE )
|
|
|
|
#define BOARDSIZE (8*8)
|
|
#define GAMESIZE 1024 /* max game size (512 moves) */
|
|
|
|
/**
|
|
* sq_rel - get relative square
|
|
* @sq: white point of view square
|
|
* @c: color
|
|
*
|
|
* Get relative (mirrored if @c is BLACK) square.
|
|
* Example: sq_rel(A1, WHITE) = A1, sq_rel(B2, BLACK) = B7
|
|
*
|
|
* @return: Relative square.
|
|
*/
|
|
#define sq_rel(sq, c) ((square_t)((sq) ^ (56 * (c))))
|
|
|
|
/**
|
|
* sq_rel_rank - get relative rank
|
|
* @rank: white point of view rank
|
|
* @c: color
|
|
*
|
|
* Get relative (mirrored if @c is BLACK) rank.
|
|
* Example: sq_rel(RANK_2, WHITE) = RANK_2, sq_rel(RANK_6, BLACK) = RANK_3
|
|
*
|
|
* @return: Relative rank.
|
|
*/
|
|
#define sq_rel_rank(rank, c) ((rank_t)((7 * (c)) ^ rank))
|
|
#define sq_rel_file(file, c) ((file_t)((7 * (c)) ^ file))
|
|
|
|
/* castle_t bits structure
|
|
*/
|
|
enum {
|
|
CASTLE_NONE = 0,
|
|
CASTLE_WK = (1 << 0), /* 0001 */
|
|
CASTLE_WQ = (1 << 1), /* 0010 */
|
|
CASTLE_BK = (1 << 2), /* 0100 */
|
|
CASTLE_BQ = (1 << 3), /* 1000 */
|
|
|
|
CASTLE_W = (CASTLE_WK | CASTLE_WQ), /* 0011 = 3 = W castle mask */
|
|
CASTLE_B = (CASTLE_BK | CASTLE_BQ), /* 1100 = 12 = B castle mask */
|
|
CASTLE_ALL = (CASTLE_W | CASTLE_B), /* 1111 = 15 */
|
|
|
|
CASTLE_K = (1 << 0), /* generic K/Q, bits 0 and 1 */
|
|
CASTLE_Q = (1 << 1),
|
|
CASTLE_KQ = (CASTLE_K |CASTLE_Q),
|
|
};
|
|
|
|
typedef u8 castle_rights_t;
|
|
|
|
/* determine is oo or ooo is possible with castle flags f and color c
|
|
*/
|
|
//#define NORM_CASTLE(f, c) ((f) >> (2 * (c))) /* shift flags to bits 0/1 */
|
|
//#define
|
|
//(NORM_CASTLE(f, c) & CASTLE_Q)
|
|
#define can_oo(f, c) ((f) & (CASTLE_K << ((c) * 2)))
|
|
#define can_ooo(f, c) ((f) & (CASTLE_Q << ((c) * 2)))
|
|
#define can_castle(f, c) ((f) & (CASTLE_KQ << ((c) * 2)))
|
|
|
|
#define clr_oo(f, c) ((f) & ~(CASTLE_K << (2 * (c))))
|
|
#define clr_ooo(f, c) ((f) & ~(CASTLE_Q << (2 * (c))))
|
|
#define clr_castle(f, c) ((f) & ~(CASTLE_KQ << (2 * (c)) ))
|
|
|
|
/* forward defs */
|
|
typedef struct __pos_s pos_t;
|
|
typedef struct __movelist_s movelist_t;
|
|
|
|
/* basic types
|
|
*/
|
|
|
|
typedef u64 bitboard_t;
|
|
typedef s16 eval_t;
|
|
|
|
/* forward enum definition is impossible in C11.
|
|
* To simplify cross-dependancies, all important enum are moved here.
|
|
*/
|
|
|
|
enum {
|
|
//_SSQUARE_ = -1, /* force signed enum */
|
|
A1 = 0, B1, C1, D1, E1, F1, G1, H1,
|
|
A2, B2, C2, D2, E2, F2, G2, H2,
|
|
A3, B3, C3, D3, E3, F3, G3, H3,
|
|
A4, B4, C4, D4, E4, F4, G4, H4,
|
|
A5, B5, C5, D5, E5, F5, G5, H5,
|
|
A6, B6, C6, D6, E6, F6, G6, H6,
|
|
A7, B7, C7, D7, E7, F7, G7, H7,
|
|
A8, B8, C8, D8, E8, F8, G8, H8,
|
|
SQUARE_NB = 64,
|
|
SQUARE_NONE = 64
|
|
};
|
|
typedef u8 square_t;
|
|
|
|
enum {
|
|
//_SFILE_ = -1, /* force signed enum */
|
|
FILE_A = 0, FILE_B, FILE_C, FILE_D, FILE_E, FILE_F, FILE_G, FILE_H,
|
|
FILE_NB,
|
|
};
|
|
typedef u8 file_t;
|
|
|
|
enum {
|
|
//_SRANK_ = -1, /* force signed enum */
|
|
RANK_1 = 0, RANK_2, RANK_3, RANK_4, RANK_5, RANK_6, RANK_7, RANK_8,
|
|
RANK_NB,
|
|
};
|
|
typedef u8 rank_t;
|
|
|
|
enum {
|
|
NORTH = 8,
|
|
EAST = 1,
|
|
SOUTH = -NORTH,
|
|
WEST = -EAST,
|
|
|
|
NORTH_EAST = (NORTH + EAST),
|
|
SOUTH_EAST = (SOUTH + EAST),
|
|
SOUTH_WEST = (SOUTH + WEST),
|
|
NORTH_WEST = (NORTH + WEST),
|
|
};
|
|
typedef u8 dir_t;
|
|
|
|
/* define diff for relative squares */
|
|
#define sq_up(c) ((c) == WHITE ? NORTH: SOUTH)
|
|
/* Attention here: We mix "up" (color dependent) and W/E, color independant.
|
|
*/
|
|
#define sq_upwest(up) ((up) - 1)
|
|
#define sq_upeast(up) ((up) + 1)
|
|
|
|
void init_all(void);
|
|
|
|
#endif /* _CHESSDEFS_H */
|