/// For Windows, part of the configuration is detected automatically, but some
/// switches need to be set manually:
///
-/// -DNDEBUG | Disable debugging mode. Use always.
+/// -DNDEBUG | Disable debugging mode. Always use this.
///
/// -DNO_PREFETCH | Disable use of prefetch asm-instruction. A must if you want
/// | the executable to run on some very old machines.
typedef uint64_t Key;
typedef uint64_t Bitboard;
-const int MAX_MOVES = 192;
+const int MAX_MOVES = 256;
const int MAX_PLY = 100;
const int MAX_PLY_PLUS_6 = MAX_PLY + 6;
/// bit 0- 5: destination square (from 0 to 63)
/// bit 6-11: origin square (from 0 to 63)
/// bit 12-13: promotion piece type - 2 (from KNIGHT-2 to QUEEN-2)
-/// bit 14-15: special move flag: promotion (1), en passant (2), castle (3)
+/// bit 14-15: special move flag: promotion (1), en passant (2), castling (3)
///
/// Special cases are MOVE_NONE and MOVE_NULL. We can sneak these in because in
/// any normal move destination square is always different from origin square
NORMAL,
PROMOTION = 1 << 14,
ENPASSANT = 2 << 14,
- CASTLE = 3 << 14
+ CASTLING = 3 << 14
};
-enum CastleRight { // Defined as in PolyGlot book hash key
- CASTLES_NONE,
+enum CastlingFlag { // Defined as in PolyGlot book hash key
+ NO_CASTLING,
WHITE_OO,
WHITE_OOO = WHITE_OO << 1,
BLACK_OO = WHITE_OO << 2,
BLACK_OOO = WHITE_OO << 3,
- ALL_CASTLES = WHITE_OO | WHITE_OOO | BLACK_OO | BLACK_OOO,
- CASTLE_RIGHT_NB = 16
+ ANY_CASTLING = WHITE_OO | WHITE_OOO | BLACK_OO | BLACK_OOO,
+ CASTLING_FLAG_NB = 16
};
enum CastlingSide {
ONE_PLY = 2,
DEPTH_ZERO = 0 * ONE_PLY,
- DEPTH_QS_CHECKS = -1 * ONE_PLY,
- DEPTH_QS_NO_CHECKS = -2 * ONE_PLY,
+ DEPTH_QS_CHECKS = 0 * ONE_PLY,
+ DEPTH_QS_NO_CHECKS = -1 * ONE_PLY,
DEPTH_QS_RECAPTURES = -5 * ONE_PLY,
DEPTH_NONE = -127 * ONE_PLY
};
-/// Score enum keeps a midgame and an endgame value in a single integer (enum),
-/// first LSB 16 bits are used to store endgame value, while upper bits are used
-/// for midgame value. Compiler is free to choose the enum type as long as can
-/// keep its data, so ensure Score to be an integer type.
+/// The Score enum stores a midgame and an endgame value in a single integer
+/// (enum). The least significant 16 bits are used to store the endgame value
+/// and the upper 16 bits are used to store the midgame value. The compiler is
+/// free to choose the enum type as long as it can store the data, so we
+/// ensure that Score is an integer type by assigning some big int values.
enum Score {
SCORE_ZERO,
SCORE_ENSURE_INTEGER_SIZE_P = INT_MAX,
}
inline Color operator~(Color c) {
- return Color(c ^ 1);
+ return Color(c ^ BLACK);
}
inline Square operator~(Square s) {
- return Square(s ^ 56); // Vertical flip SQ_A1 -> SQ_A8
+ return Square(s ^ SQ_A8); // Vertical flip SQ_A1 -> SQ_A8
}
inline Square operator|(File f, Rank r) {
return Piece((c << 3) | pt);
}
-inline CastleRight make_castle_right(Color c, CastlingSide s) {
- return CastleRight(WHITE_OO << ((s == QUEEN_SIDE) + 2 * c));
+inline CastlingFlag make_castling_flag(Color c, CastlingSide s) {
+ return CastlingFlag(WHITE_OO << ((s == QUEEN_SIDE) + 2 * c));
}
inline PieceType type_of(Piece p) {
return Rank(s >> 3);
}
-inline Square mirror(Square s) {
- return Square(s ^ 7); // Horizontal flip SQ_A1 -> SQ_H1
-}
-
inline Square relative_square(Color c, Square s) {
return Square(s ^ (c * 56));
}