summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
4f14bd5)
No functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
// Remove illegal moves from the list
for (int i = 0; i < n; i++)
// Remove illegal moves from the list
for (int i = 0; i < n; i++)
- if (!pos.move_is_legal(mlist[i].move, pinned))
+ if (!pos.pl_move_is_legal(mlist[i].move, pinned))
mlist[i--].move = mlist[--n].move;
return n;
}
mlist[i--].move = mlist[--n].move;
return n;
}
-/// generate_move_if_legal() takes a position and a (not necessarily
-/// pseudo-legal) move and a pinned pieces bitboard as input, and tests
-/// whether the move is legal. If the move is legal, the move itself is
-/// returned. If not, the function returns MOVE_NONE. This function must
+/// move_is_legal() takes a position and a (not necessarily pseudo-legal)
+/// move and a pinned pieces bitboard as input, and tests whether
+/// the move is legal. If the move is legal, the move itself is
+/// returned. If not, the function returns false. This function must
/// only be used when the side to move is not in check.
/// only be used when the side to move is not in check.
-Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
+bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) {
assert(pos.is_ok());
assert(!pos.is_check());
assert(pos.is_ok());
assert(!pos.is_check());
// If the from square is not occupied by a piece belonging to the side to
// move, the move is obviously not legal.
if (color_of_piece(pc) != us)
// If the from square is not occupied by a piece belonging to the side to
// move, the move is obviously not legal.
if (color_of_piece(pc) != us)
// en passant square.
if ( type_of_piece(pc) != PAWN
|| to != pos.ep_square())
// en passant square.
if ( type_of_piece(pc) != PAWN
|| to != pos.ep_square())
assert(pos.square_is_empty(to));
assert(pos.piece_on(to - pawn_push(us)) == pawn_of_color(them));
assert(pos.square_is_empty(to));
assert(pos.piece_on(to - pawn_push(us)) == pawn_of_color(them));
- // The move is pseudo-legal. If it is legal, return it.
- return (pos.move_is_legal(m, pinned) ? m : MOVE_NONE);
+ // The move is pseudo-legal, check if it is also legal
+ return pos.pl_move_is_legal(m, pinned);
// the right to castle kingside.
if ( type_of_piece(pc) != KING
||!pos.can_castle_kingside(us))
// the right to castle kingside.
if ( type_of_piece(pc) != KING
||!pos.can_castle_kingside(us))
assert(from == pos.king_square(us));
assert(to == pos.initial_kr_square(us));
assert(from == pos.king_square(us));
assert(to == pos.initial_kr_square(us));
if (s != from && s != to && !pos.square_is_empty(s))
illegal = true;
if (s != from && s != to && !pos.square_is_empty(s))
illegal = true;
- return (!illegal ? m : MOVE_NONE);
}
if (move_is_long_castle(m))
}
if (move_is_long_castle(m))
// the right to castle kingside.
if ( type_of_piece(pc) != KING
||!pos.can_castle_queenside(us))
// the right to castle kingside.
if ( type_of_piece(pc) != KING
||!pos.can_castle_queenside(us))
assert(from == pos.king_square(us));
assert(to == pos.initial_qr_square(us));
assert(from == pos.king_square(us));
assert(to == pos.initial_qr_square(us));
|| pos.piece_on(to + DELTA_W) == queen_of_color(them)))
illegal = true;
|| pos.piece_on(to + DELTA_W) == queen_of_color(them)))
illegal = true;
- return (!illegal ? m : MOVE_NONE);
}
// Normal moves
// The destination square cannot be occupied by a friendly piece
if (pos.color_of_piece_on(to) == us)
}
// Normal moves
// The destination square cannot be occupied by a friendly piece
if (pos.color_of_piece_on(to) == us)
// Proceed according to the type of the moving piece.
if (type_of_piece(pc) == PAWN)
// Proceed according to the type of the moving piece.
if (type_of_piece(pc) == PAWN)
if ( ( (square_rank(to) == RANK_8 && us == WHITE)
||(square_rank(to) == RANK_1 && us != WHITE))
&& !move_promotion(m))
if ( ( (square_rank(to) == RANK_8 && us == WHITE)
||(square_rank(to) == RANK_1 && us != WHITE))
&& !move_promotion(m))
// Proceed according to the square delta between the source and
// destionation squares.
// Proceed according to the square delta between the source and
// destionation squares.
// Capture. The destination square must be occupied by an enemy
// piece (en passant captures was handled earlier).
if (pos.color_of_piece_on(to) != them)
// Capture. The destination square must be occupied by an enemy
// piece (en passant captures was handled earlier).
if (pos.color_of_piece_on(to) != them)
break;
case DELTA_N:
case DELTA_S:
// Pawn push. The destination square must be empty.
if (!pos.square_is_empty(to))
break;
case DELTA_N:
case DELTA_S:
// Pawn push. The destination square must be empty.
if (!pos.square_is_empty(to))
if ( square_rank(to) != RANK_4
|| !pos.square_is_empty(to)
|| !pos.square_is_empty(from + DELTA_N))
if ( square_rank(to) != RANK_4
|| !pos.square_is_empty(to)
|| !pos.square_is_empty(from + DELTA_N))
if ( square_rank(to) != RANK_5
|| !pos.square_is_empty(to)
|| !pos.square_is_empty(from + DELTA_S))
if ( square_rank(to) != RANK_5
|| !pos.square_is_empty(to)
|| !pos.square_is_empty(from + DELTA_S))
- // The move is pseudo-legal. Return it if it is legal.
- return (pos.move_is_legal(m, pinned) ? m : MOVE_NONE);
+ // The move is pseudo-legal, check if it is also legal
+ return pos.pl_move_is_legal(m, pinned);
}
// Luckly we can handle all the other pieces in one go
return ( pos.piece_attacks_square(from, to)
}
// Luckly we can handle all the other pieces in one go
return ( pos.piece_attacks_square(from, to)
- && pos.move_is_legal(m, pinned)
- && !move_promotion(m) ? m : MOVE_NONE);
+ && pos.pl_move_is_legal(m, pinned)
+ && !move_promotion(m));
extern int generate_checks(const Position &pos, MoveStack *mlist, Bitboard dc);
extern int generate_evasions(const Position &pos, MoveStack *mlist);
extern int generate_legal_moves(const Position &pos, MoveStack *mlist);
extern int generate_checks(const Position &pos, MoveStack *mlist, Bitboard dc);
extern int generate_evasions(const Position &pos, MoveStack *mlist);
extern int generate_legal_moves(const Position &pos, MoveStack *mlist);
-extern Move generate_move_if_legal(const Position &pos, Move m, Bitboard pinned);
+extern bool move_is_legal(const Position &pos, const Move m, Bitboard pinned);
#endif // !defined(MOVEGEN_H_INCLUDED)
#endif // !defined(MOVEGEN_H_INCLUDED)
if (ttMove != MOVE_NONE)
{
assert(move_is_ok(ttMove));
if (ttMove != MOVE_NONE)
{
assert(move_is_ok(ttMove));
- if (generate_move_if_legal(pos, ttMove, pinned) != MOVE_NONE)
+ if (move_is_legal(pos, ttMove, pinned))
if (mateKiller != MOVE_NONE)
{
assert(move_is_ok(mateKiller));
if (mateKiller != MOVE_NONE)
{
assert(move_is_ok(mateKiller));
- if (generate_move_if_legal(pos, mateKiller, pinned) != MOVE_NONE)
+ if (move_is_legal(pos, mateKiller, pinned))
return mateKiller;
}
break;
return mateKiller;
}
break;
moves[bestIndex] = moves[movesPicked++];
if ( move != ttMove
&& move != mateKiller
moves[bestIndex] = moves[movesPicked++];
if ( move != ttMove
&& move != mateKiller
- && pos.move_is_legal(move, pinned))
+ && pos.pl_move_is_legal(move, pinned))
moves[bestIndex] = moves[movesPicked++];
if ( move != ttMove
&& move != mateKiller
moves[bestIndex] = moves[movesPicked++];
if ( move != ttMove
&& move != mateKiller
- && pos.move_is_legal(move, pinned))
+ && pos.pl_move_is_legal(move, pinned))
move = badCaptures[badCapturesPicked++].move;
if ( move != ttMove
&& move != mateKiller
move = badCaptures[badCapturesPicked++].move;
if ( move != ttMove
&& move != mateKiller
- && pos.move_is_legal(move, pinned))
+ && pos.pl_move_is_legal(move, pinned))
moves[bestIndex] = moves[movesPicked++];
// Remember to change the line below if we decide to hash the qsearch!
// Maybe also postpone the legality check until after futility pruning?
moves[bestIndex] = moves[movesPicked++];
// Remember to change the line below if we decide to hash the qsearch!
// Maybe also postpone the legality check until after futility pruning?
- if (/* move != ttMove && */ pos.move_is_legal(move, pinned))
+ if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned))
{
move = moves[movesPicked++].move;
// Remember to change the line below if we decide to hash the qsearch!
{
move = moves[movesPicked++].move;
// Remember to change the line below if we decide to hash the qsearch!
- if (/* move != ttMove && */ pos.move_is_legal(move, pinned))
+ if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned))
-/// Position::move_is_legal() tests whether a pseudo-legal move is legal.
+/// Position::pl_move_is_legal() tests whether a pseudo-legal move is legal.
/// There are two versions of this function: One which takes only a
/// move as input, and one which takes a move and a bitboard of pinned
/// pieces. The latter function is faster, and should always be preferred
/// when a pinned piece bitboard has already been computed.
/// There are two versions of this function: One which takes only a
/// move as input, and one which takes a move and a bitboard of pinned
/// pieces. The latter function is faster, and should always be preferred
/// when a pinned piece bitboard has already been computed.
-bool Position::move_is_legal(Move m) const {
+bool Position::pl_move_is_legal(Move m) const {
- return move_is_legal(m, pinned_pieces(side_to_move()));
+ return pl_move_is_legal(m, pinned_pieces(side_to_move()));
-bool Position::move_is_legal(Move m, Bitboard pinned) const {
+bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
Color us, them;
Square ksq, from;
Color us, them;
Square ksq, from;
bool piece_attacks_square(Square f, Square t) const; // Dispatch at run-time
// Properties of moves
bool piece_attacks_square(Square f, Square t) const; // Dispatch at run-time
// Properties of moves
- bool move_is_legal(Move m) const;
- bool move_is_legal(Move m, Bitboard pinned) const;
+ bool pl_move_is_legal(Move m) const;
+ bool pl_move_is_legal(Move m, Bitboard pinned) const;
bool move_is_check(Move m) const;
bool move_is_check(Move m, Bitboard dcCandidates) const;
bool move_is_capture(Move m) const;
bool move_is_check(Move m) const;
bool move_is_check(Move m, Bitboard dcCandidates) const;
bool move_is_capture(Move m) const;
if(movestr == "O-O-O") {
Move m;
while((m = mp.get_next_move()) != MOVE_NONE)
if(movestr == "O-O-O") {
Move m;
while((m = mp.get_next_move()) != MOVE_NONE)
- if(move_is_long_castle(m) && pos.move_is_legal(m))
+ if(move_is_long_castle(m) && pos.pl_move_is_legal(m))
return m;
return MOVE_NONE;
}
else if(movestr == "O-O") {
Move m;
while((m = mp.get_next_move()) != MOVE_NONE)
return m;
return MOVE_NONE;
}
else if(movestr == "O-O") {
Move m;
while((m = mp.get_next_move()) != MOVE_NONE)
- if(move_is_short_castle(m) && pos.move_is_legal(m))
+ if(move_is_short_castle(m) && pos.pl_move_is_legal(m))
return m;
return MOVE_NONE;
}
return m;
return MOVE_NONE;
}
n = 0;
while((mv = mp.get_next_move()) != MOVE_NONE)
if(move_to(mv) == to && pos.piece_on(move_from(mv)) == pc
n = 0;
while((mv = mp.get_next_move()) != MOVE_NONE)
if(move_to(mv) == to && pos.piece_on(move_from(mv)) == pc
- && pos.move_is_legal(mv))
+ && pos.pl_move_is_legal(mv))
moveList[n++] = mv;
if(n == 1)
return AMBIGUITY_NONE;
moveList[n++] = mv;
if(n == 1)
return AMBIGUITY_NONE;