for (Square sq = sqH; sq >= sqA; sq--)
if (piece_on(sq) == rook)
{
- do_allow_oo(c);
+ set_castle_kingside(c);
initialKRFile = square_file(sq);
break;
}
for (Square sq = sqA; sq <= sqH; sq++)
if (piece_on(sq) == rook)
{
- do_allow_ooo(c);
+ set_castle_queenside(c);
initialQRFile = square_file(sq);
break;
}
File rookFile = File(token - 'A') + FILE_A;
if (rookFile < initialKFile)
{
- do_allow_ooo(c);
+ set_castle_queenside(c);
initialQRFile = rookFile;
}
else
{
- do_allow_oo(c);
+ set_castle_kingside(c);
initialKRFile = rookFile;
}
}
return move_is_pl_slow(m);
// Is not a promotion, so promotion piece must be empty
- if (move_promotion_piece(m) - 2 != PIECE_TYPE_NONE)
+ if (promotion_piece_type(m) - 2 != PIECE_TYPE_NONE)
return false;
// If the from square is not occupied by a piece belonging to the side to
{
clear_bit(&b, from);
- switch (move_promotion_piece(m))
+ switch (promotion_piece_type(m))
{
case KNIGHT:
return bit_is_set(attacks_from<KNIGHT>(to), ci.ksq);
st->epSquare = SQ_NONE;
}
- // Update castle rights, try to shortcut a common case
- int cm = castleRightsMask[from] & castleRightsMask[to];
- if (cm != ALL_CASTLES && ((cm & st->castleRights) != st->castleRights))
+ // Update castle rights if needed
+ if ( st->castleRights != CASTLES_NONE
+ && (castleRightsMask[from] & castleRightsMask[to]) != ALL_CASTLES)
{
key ^= zobCastle[st->castleRights];
- st->castleRights &= castleRightsMask[from];
- st->castleRights &= castleRightsMask[to];
+ st->castleRights &= castleRightsMask[from] & castleRightsMask[to];
key ^= zobCastle[st->castleRights];
}
if (pm) // promotion ?
{
- PieceType promotion = move_promotion_piece(m);
+ PieceType promotion = promotion_piece_type(m);
assert(promotion >= KNIGHT && promotion <= QUEEN);
if (pm) // promotion ?
{
- PieceType promotion = move_promotion_piece(m);
+ PieceType promotion = promotion_piece_type(m);
pt = PAWN;
assert(promotion >= KNIGHT && promotion <= QUEEN);
sideToMove = opposite_color(pos.side_to_move());
// Castling rights
- if (pos.can_castle_kingside(WHITE)) do_allow_oo(BLACK);
- if (pos.can_castle_queenside(WHITE)) do_allow_ooo(BLACK);
- if (pos.can_castle_kingside(BLACK)) do_allow_oo(WHITE);
- if (pos.can_castle_queenside(BLACK)) do_allow_ooo(WHITE);
+ if (pos.can_castle_kingside(WHITE)) set_castle_kingside(BLACK);
+ if (pos.can_castle_queenside(WHITE)) set_castle_queenside(BLACK);
+ if (pos.can_castle_kingside(BLACK)) set_castle_kingside(WHITE);
+ if (pos.can_castle_queenside(BLACK)) set_castle_queenside(WHITE);
initialKFile = pos.initialKFile;
initialKRFile = pos.initialKRFile;
void clear();
void detach();
void put_piece(Piece p, Square s);
- void do_allow_oo(Color c);
- void do_allow_ooo(Color c);
+ void set_castle_kingside(Color c);
+ void set_castle_queenside(Color c);
bool set_castling_rights(char token);
bool move_is_pl_slow(const Move m) const;
return pieceList[c][KING][0];
}
-inline bool Position::can_castle_kingside(Color side) const {
- return st->castleRights & (1+int(side));
+inline bool Position::can_castle_kingside(Color c) const {
+ return st->castleRights & (WHITE_OO << c);
}
-inline bool Position::can_castle_queenside(Color side) const {
- return st->castleRights & (4+4*int(side));
+inline bool Position::can_castle_queenside(Color c) const {
+ return st->castleRights & (WHITE_OOO << c);
}
-inline bool Position::can_castle(Color side) const {
- return can_castle_kingside(side) || can_castle_queenside(side);
+inline bool Position::can_castle(Color c) const {
+ return st->castleRights & ((WHITE_OO | WHITE_OOO) << c);
+}
+
+inline void Position::set_castle_kingside(Color c) {
+ st->castleRights |= (WHITE_OO << c);
+}
+
+inline void Position::set_castle_queenside(Color c) {
+ st->castleRights |= (WHITE_OOO << c);
}
inline Square Position::initial_kr_square(Color c) const {
return threadID;
}
-inline void Position::do_allow_oo(Color c) {
- st->castleRights |= (1 + int(c));
-}
-
-inline void Position::do_allow_ooo(Color c) {
- st->castleRights |= (4 + 4*int(c));
-}
-
#endif // !defined(POSITION_H_INCLUDED)