mirror of
https://github.com/sockspls/badfish
synced 2025-05-02 01:29:36 +00:00
Small tweak in is_pseudo_legal()
This is difficult code becuase a bug here could lead to very subtle crashes in case of SMP games where we have TT move corruption due to concurrent access. Anyhow I have fully verified te code throwing at it random moves. It shoudl work. No functional change.
This commit is contained in:
parent
158014b39d
commit
423c6d8a8a
1 changed files with 4 additions and 7 deletions
|
@ -542,7 +542,6 @@ bool Position::move_is_legal(const Move m) const {
|
||||||
bool Position::is_pseudo_legal(const Move m) const {
|
bool Position::is_pseudo_legal(const Move m) const {
|
||||||
|
|
||||||
Color us = sideToMove;
|
Color us = sideToMove;
|
||||||
Color them = ~sideToMove;
|
|
||||||
Square from = from_sq(m);
|
Square from = from_sq(m);
|
||||||
Square to = to_sq(m);
|
Square to = to_sq(m);
|
||||||
Piece pc = piece_moved(m);
|
Piece pc = piece_moved(m);
|
||||||
|
@ -587,7 +586,7 @@ bool Position::is_pseudo_legal(const Move m) const {
|
||||||
case DELTA_SE:
|
case DELTA_SE:
|
||||||
// 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 (piece_on(to) == NO_PIECE || color_of(piece_on(to)) != them)
|
if (piece_on(to) == NO_PIECE || color_of(piece_on(to)) != ~us)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// From and to files must be one file apart, avoids a7h5
|
// From and to files must be one file apart, avoids a7h5
|
||||||
|
@ -636,14 +635,12 @@ bool Position::is_pseudo_legal(const Move m) const {
|
||||||
{
|
{
|
||||||
if (type_of(pc) != KING)
|
if (type_of(pc) != KING)
|
||||||
{
|
{
|
||||||
Bitboard b = checkers();
|
// Double check? In this case a king move is required
|
||||||
Square checksq = pop_lsb(&b);
|
if (more_than_one(checkers()))
|
||||||
|
|
||||||
if (b) // double check ? In this case a king move is required
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Our move must be a blocking evasion or a capture of the checking piece
|
// Our move must be a blocking evasion or a capture of the checking piece
|
||||||
if (!((between_bb(checksq, king_square(us)) | checkers()) & to))
|
if (!((between_bb(lsb(checkers()), king_square(us)) | checkers()) & to))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// In case of king moves under check we have to remove king so to catch
|
// In case of king moves under check we have to remove king so to catch
|
||||||
|
|
Loading…
Add table
Reference in a new issue