mirror of
https://github.com/sockspls/badfish
synced 2025-07-13 12:39:16 +00:00
Better naming of pseudo-legality and legality testing
No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
4f14bd5032
commit
4397e6c03e
6 changed files with 42 additions and 42 deletions
|
@ -385,20 +385,20 @@ int generate_legal_moves(const Position& pos, MoveStack* mlist) {
|
||||||
|
|
||||||
// Remove illegal moves from the list
|
// Remove illegal moves from the list
|
||||||
for (int i = 0; i < n; i++)
|
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;
|
mlist[i--].move = mlist[--n].move;
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// generate_move_if_legal() takes a position and a (not necessarily
|
/// move_is_legal() takes a position and a (not necessarily pseudo-legal)
|
||||||
/// pseudo-legal) move and a pinned pieces bitboard as input, and tests
|
/// move and a pinned pieces bitboard as input, and tests whether
|
||||||
/// whether the move is legal. If the move is legal, the move itself is
|
/// the move is legal. If the move is legal, the move itself is
|
||||||
/// returned. If not, the function returns MOVE_NONE. This function must
|
/// 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_ok());
|
||||||
assert(!pos.is_check());
|
assert(!pos.is_check());
|
||||||
|
@ -413,7 +413,7 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
// If the from square is not occupied by a piece belonging to the side to
|
// If the from square is not occupied by a piece belonging to the side to
|
||||||
// move, the move is obviously not legal.
|
// move, the move is obviously not legal.
|
||||||
if (color_of_piece(pc) != us)
|
if (color_of_piece(pc) != us)
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
|
|
||||||
Square to = move_to(m);
|
Square to = move_to(m);
|
||||||
|
|
||||||
|
@ -424,13 +424,13 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
// en passant square.
|
// en passant square.
|
||||||
if ( type_of_piece(pc) != PAWN
|
if ( type_of_piece(pc) != PAWN
|
||||||
|| to != pos.ep_square())
|
|| to != pos.ep_square())
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
|
|
||||||
assert(pos.square_is_empty(to));
|
assert(pos.square_is_empty(to));
|
||||||
assert(pos.piece_on(to - pawn_push(us)) == pawn_of_color(them));
|
assert(pos.piece_on(to - pawn_push(us)) == pawn_of_color(them));
|
||||||
|
|
||||||
// The move is pseudo-legal. If it is legal, return it.
|
// The move is pseudo-legal, check if it is also legal
|
||||||
return (pos.move_is_legal(m, pinned) ? m : MOVE_NONE);
|
return pos.pl_move_is_legal(m, pinned);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Castling moves
|
// Castling moves
|
||||||
|
@ -440,7 +440,7 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
// the right to castle kingside.
|
// the right to castle kingside.
|
||||||
if ( type_of_piece(pc) != KING
|
if ( type_of_piece(pc) != KING
|
||||||
||!pos.can_castle_kingside(us))
|
||!pos.can_castle_kingside(us))
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
|
|
||||||
assert(from == pos.king_square(us));
|
assert(from == pos.king_square(us));
|
||||||
assert(to == pos.initial_kr_square(us));
|
assert(to == pos.initial_kr_square(us));
|
||||||
|
@ -464,7 +464,7 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
if (s != from && s != to && !pos.square_is_empty(s))
|
if (s != from && s != to && !pos.square_is_empty(s))
|
||||||
illegal = true;
|
illegal = true;
|
||||||
|
|
||||||
return (!illegal ? m : MOVE_NONE);
|
return !illegal;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move_is_long_castle(m))
|
if (move_is_long_castle(m))
|
||||||
|
@ -473,7 +473,7 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
// the right to castle kingside.
|
// the right to castle kingside.
|
||||||
if ( type_of_piece(pc) != KING
|
if ( type_of_piece(pc) != KING
|
||||||
||!pos.can_castle_queenside(us))
|
||!pos.can_castle_queenside(us))
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
|
|
||||||
assert(from == pos.king_square(us));
|
assert(from == pos.king_square(us));
|
||||||
assert(to == pos.initial_qr_square(us));
|
assert(to == pos.initial_qr_square(us));
|
||||||
|
@ -498,14 +498,14 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
|| pos.piece_on(to + DELTA_W) == queen_of_color(them)))
|
|| pos.piece_on(to + DELTA_W) == queen_of_color(them)))
|
||||||
illegal = true;
|
illegal = true;
|
||||||
|
|
||||||
return (!illegal ? m : MOVE_NONE);
|
return !illegal;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal moves
|
// Normal moves
|
||||||
|
|
||||||
// The destination square cannot be occupied by a friendly piece
|
// The destination square cannot be occupied by a friendly piece
|
||||||
if (pos.color_of_piece_on(to) == us)
|
if (pos.color_of_piece_on(to) == us)
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
|
|
||||||
// Proceed according to the type of the moving piece.
|
// Proceed according to the type of the moving piece.
|
||||||
if (type_of_piece(pc) == PAWN)
|
if (type_of_piece(pc) == PAWN)
|
||||||
|
@ -515,7 +515,7 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
if ( ( (square_rank(to) == RANK_8 && us == WHITE)
|
if ( ( (square_rank(to) == RANK_8 && us == WHITE)
|
||||||
||(square_rank(to) == RANK_1 && us != WHITE))
|
||(square_rank(to) == RANK_1 && us != WHITE))
|
||||||
&& !move_promotion(m))
|
&& !move_promotion(m))
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
|
|
||||||
// Proceed according to the square delta between the source and
|
// Proceed according to the square delta between the source and
|
||||||
// destionation squares.
|
// destionation squares.
|
||||||
|
@ -528,14 +528,14 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
// Capture. The destination square must be occupied by an enemy
|
// Capture. The destination square must be occupied by an enemy
|
||||||
// piece (en passant captures was handled earlier).
|
// piece (en passant captures was handled earlier).
|
||||||
if (pos.color_of_piece_on(to) != them)
|
if (pos.color_of_piece_on(to) != them)
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DELTA_N:
|
case DELTA_N:
|
||||||
case DELTA_S:
|
case DELTA_S:
|
||||||
// Pawn push. The destination square must be empty.
|
// Pawn push. The destination square must be empty.
|
||||||
if (!pos.square_is_empty(to))
|
if (!pos.square_is_empty(to))
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DELTA_NN:
|
case DELTA_NN:
|
||||||
|
@ -545,7 +545,7 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
if ( square_rank(to) != RANK_4
|
if ( square_rank(to) != RANK_4
|
||||||
|| !pos.square_is_empty(to)
|
|| !pos.square_is_empty(to)
|
||||||
|| !pos.square_is_empty(from + DELTA_N))
|
|| !pos.square_is_empty(from + DELTA_N))
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DELTA_SS:
|
case DELTA_SS:
|
||||||
|
@ -555,20 +555,20 @@ Move generate_move_if_legal(const Position& pos, Move m, Bitboard pinned) {
|
||||||
if ( square_rank(to) != RANK_5
|
if ( square_rank(to) != RANK_5
|
||||||
|| !pos.square_is_empty(to)
|
|| !pos.square_is_empty(to)
|
||||||
|| !pos.square_is_empty(from + DELTA_S))
|
|| !pos.square_is_empty(from + DELTA_S))
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return MOVE_NONE;
|
return false;
|
||||||
}
|
}
|
||||||
// The move is pseudo-legal. Return it if it is legal.
|
// The move is pseudo-legal, check if it is also legal
|
||||||
return (pos.move_is_legal(m, pinned) ? m : MOVE_NONE);
|
return pos.pl_move_is_legal(m, pinned);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Luckly we can handle all the other pieces in one go
|
// Luckly we can handle all the other pieces in one go
|
||||||
return ( pos.piece_attacks_square(from, to)
|
return ( pos.piece_attacks_square(from, to)
|
||||||
&& pos.move_is_legal(m, pinned)
|
&& pos.pl_move_is_legal(m, pinned)
|
||||||
&& !move_promotion(m) ? m : MOVE_NONE);
|
&& !move_promotion(m));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,6 @@ extern int generate_noncaptures(const Position &pos, MoveStack *mlist);
|
||||||
extern int generate_checks(const Position &pos, MoveStack *mlist, Bitboard dc);
|
extern int generate_checks(const Position &pos, MoveStack *mlist, Bitboard dc);
|
||||||
extern int generate_evasions(const Position &pos, MoveStack *mlist);
|
extern int generate_evasions(const Position &pos, MoveStack *mlist);
|
||||||
extern int generate_legal_moves(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)
|
||||||
|
|
|
@ -116,7 +116,7 @@ Move MovePicker::get_next_move() {
|
||||||
if (ttMove != MOVE_NONE)
|
if (ttMove != MOVE_NONE)
|
||||||
{
|
{
|
||||||
assert(move_is_ok(ttMove));
|
assert(move_is_ok(ttMove));
|
||||||
if (generate_move_if_legal(pos, ttMove, pinned) != MOVE_NONE)
|
if (move_is_legal(pos, ttMove, pinned))
|
||||||
return ttMove;
|
return ttMove;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -125,7 +125,7 @@ Move MovePicker::get_next_move() {
|
||||||
if (mateKiller != MOVE_NONE)
|
if (mateKiller != MOVE_NONE)
|
||||||
{
|
{
|
||||||
assert(move_is_ok(mateKiller));
|
assert(move_is_ok(mateKiller));
|
||||||
if (generate_move_if_legal(pos, mateKiller, pinned) != MOVE_NONE)
|
if (move_is_legal(pos, mateKiller, pinned))
|
||||||
return mateKiller;
|
return mateKiller;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -333,7 +333,7 @@ Move MovePicker::pick_move_from_list() {
|
||||||
moves[bestIndex] = moves[movesPicked++];
|
moves[bestIndex] = moves[movesPicked++];
|
||||||
if ( move != ttMove
|
if ( move != ttMove
|
||||||
&& move != mateKiller
|
&& move != mateKiller
|
||||||
&& pos.move_is_legal(move, pinned))
|
&& pos.pl_move_is_legal(move, pinned))
|
||||||
return move;
|
return move;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -357,7 +357,7 @@ Move MovePicker::pick_move_from_list() {
|
||||||
moves[bestIndex] = moves[movesPicked++];
|
moves[bestIndex] = moves[movesPicked++];
|
||||||
if ( move != ttMove
|
if ( move != ttMove
|
||||||
&& move != mateKiller
|
&& move != mateKiller
|
||||||
&& pos.move_is_legal(move, pinned))
|
&& pos.pl_move_is_legal(move, pinned))
|
||||||
return move;
|
return move;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -390,7 +390,7 @@ Move MovePicker::pick_move_from_list() {
|
||||||
move = badCaptures[badCapturesPicked++].move;
|
move = badCaptures[badCapturesPicked++].move;
|
||||||
if ( move != ttMove
|
if ( move != ttMove
|
||||||
&& move != mateKiller
|
&& move != mateKiller
|
||||||
&& pos.move_is_legal(move, pinned))
|
&& pos.pl_move_is_legal(move, pinned))
|
||||||
return move;
|
return move;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -408,7 +408,7 @@ Move MovePicker::pick_move_from_list() {
|
||||||
moves[bestIndex] = moves[movesPicked++];
|
moves[bestIndex] = moves[movesPicked++];
|
||||||
// Remember to change the line below if we decide to hash the qsearch!
|
// Remember to change the line below if we decide to hash the qsearch!
|
||||||
// Maybe also postpone the legality check until after futility pruning?
|
// 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))
|
||||||
return move;
|
return move;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -423,7 +423,7 @@ Move MovePicker::pick_move_from_list() {
|
||||||
{
|
{
|
||||||
move = moves[movesPicked++].move;
|
move = moves[movesPicked++].move;
|
||||||
// Remember to change the line below if we decide to hash the qsearch!
|
// 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))
|
||||||
return move;
|
return move;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -456,18 +456,18 @@ void Position::find_checkers() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// 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
|
/// 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
|
/// 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
|
/// pieces. The latter function is faster, and should always be preferred
|
||||||
/// when a pinned piece bitboard has already been computed.
|
/// 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;
|
Color us, them;
|
||||||
Square ksq, from;
|
Square ksq, from;
|
||||||
|
|
|
@ -217,8 +217,8 @@ public:
|
||||||
bool piece_attacks_square(Square f, Square t) const; // Dispatch at run-time
|
bool piece_attacks_square(Square f, Square t) const; // Dispatch at run-time
|
||||||
|
|
||||||
// Properties of moves
|
// Properties of moves
|
||||||
bool move_is_legal(Move m) const;
|
bool pl_move_is_legal(Move m) const;
|
||||||
bool move_is_legal(Move m, Bitboard pinned) const;
|
bool pl_move_is_legal(Move m, Bitboard pinned) const;
|
||||||
bool move_is_check(Move m) const;
|
bool move_is_check(Move m) const;
|
||||||
bool move_is_check(Move m, Bitboard dcCandidates) const;
|
bool move_is_check(Move m, Bitboard dcCandidates) const;
|
||||||
bool move_is_capture(Move m) const;
|
bool move_is_capture(Move m) const;
|
||||||
|
|
|
@ -161,14 +161,14 @@ Move move_from_san(Position &pos, const std::string &movestr) {
|
||||||
if(movestr == "O-O-O") {
|
if(movestr == "O-O-O") {
|
||||||
Move m;
|
Move m;
|
||||||
while((m = mp.get_next_move()) != MOVE_NONE)
|
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 m;
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
}
|
}
|
||||||
else if(movestr == "O-O") {
|
else if(movestr == "O-O") {
|
||||||
Move m;
|
Move m;
|
||||||
while((m = mp.get_next_move()) != MOVE_NONE)
|
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 m;
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
}
|
}
|
||||||
|
@ -358,7 +358,7 @@ namespace {
|
||||||
n = 0;
|
n = 0;
|
||||||
while((mv = mp.get_next_move()) != MOVE_NONE)
|
while((mv = mp.get_next_move()) != MOVE_NONE)
|
||||||
if(move_to(mv) == to && pos.piece_on(move_from(mv)) == pc
|
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;
|
moveList[n++] = mv;
|
||||||
if(n == 1)
|
if(n == 1)
|
||||||
return AMBIGUITY_NONE;
|
return AMBIGUITY_NONE;
|
||||||
|
|
Loading…
Add table
Reference in a new issue