1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 00:33:09 +00:00

Unify black and white code in generate_move_if_legal()

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2008-10-17 15:38:00 +02:00
parent 158911425b
commit 8be2c483a1

View file

@ -712,127 +712,99 @@ Move generate_move_if_legal(const Position &pos, Move m, Bitboard pinned) {
return MOVE_NONE; return MOVE_NONE;
// Proceed according to the type of the moving piece. // Proceed according to the type of the moving piece.
switch(type_of_piece(pc)) { switch (type_of_piece(pc))
{
case PAWN: case PAWN:
// Pawn moves, as usual, are somewhat messy. // If the destination square is on the 8/1th rank, the move must
if (us == WHITE) // be a promotion.
if ( ( (square_rank(to) == RANK_8 && us == WHITE)
||(square_rank(to) == RANK_1 && us != WHITE))
&& !move_promotion(m))
return MOVE_NONE;
// Proceed according to the square delta between the source and
// destionation squares.
switch (to - from)
{ {
// If the destination square is on the 8th rank, the move must case DELTA_NW:
// be a promotion. case DELTA_NE:
if (square_rank(to) == RANK_8 && !move_promotion(m)) case DELTA_SW:
case DELTA_SE:
// 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)
return MOVE_NONE; return MOVE_NONE;
break;
// Proceed according to the square delta between the source and case DELTA_N:
// destionation squares. case DELTA_S:
switch (to - from) // Pawn push. The destination square must be empty.
{ if (!pos.square_is_empty(to))
case DELTA_NW: return MOVE_NONE;
case DELTA_NE: break;
// 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)
return MOVE_NONE;
break;
case DELTA_N: case DELTA_NN:
// Pawn push. The destination square must be empty. // Double white pawn push. The destination square must be on the fourth
if (!pos.square_is_empty(to)) // rank, and both the destination square and the square between the
return MOVE_NONE; // source and destination squares must be empty.
break; if ( square_rank(to) != RANK_4
|| !pos.square_is_empty(to)
|| !pos.square_is_empty(from + DELTA_N))
return MOVE_NONE;
break;
case DELTA_NN: case DELTA_SS:
// Double pawn push. The destination square must be on the fourth // Double black pawn push. The destination square must be on the fifth
// rank, and both the destination square and the square between the // rank, and both the destination square and the square between the
// source and destination squares must be empty. // source and destination squares must be empty.
if ( square_rank(to) != RANK_4 if ( square_rank(to) != RANK_5
|| !pos.square_is_empty(to) || !pos.square_is_empty(to)
|| !pos.square_is_empty(from + DELTA_N)) || !pos.square_is_empty(from + DELTA_S))
return MOVE_NONE; return MOVE_NONE;
break; break;
default: default:
return MOVE_NONE; return MOVE_NONE;
}
}
else // (us == BLACK)
{
// If the destination square is on the 1th rank, the move must
// be a promotion.
if (square_rank(to) == RANK_1 && !move_promotion(m))
return MOVE_NONE;
// Proceed according to the square delta between the source and
// destionation squares.
switch (to - from)
{
case DELTA_SW:
case DELTA_SE:
// 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)
return MOVE_NONE;
break;
case DELTA_S:
// Pawn push. The destination square must be empty.
if (!pos.square_is_empty(to))
return MOVE_NONE;
break;
case DELTA_SS:
// Double pawn push. The destination square must be on the fifth
// rank, and both the destination square and the square between the
// source and destination squares must be empty.
if ( square_rank(to) != RANK_5
|| !pos.square_is_empty(to)
|| !pos.square_is_empty(from + DELTA_S))
return MOVE_NONE;
break;
default:
return MOVE_NONE;
}
} }
// The move is pseudo-legal. Return it if it is legal. // The move is pseudo-legal. Return it if it is legal.
return (pos.move_is_legal(m) ? m : MOVE_NONE); return (pos.move_is_legal(m) ? m : MOVE_NONE);
break; break;
case KNIGHT: case KNIGHT:
return ( pos.knight_attacks_square(from, to) return ( pos.knight_attacks_square(from, to)
&& pos.move_is_legal(m) && pos.move_is_legal(m)
&& !move_promotion(m) ? m : MOVE_NONE); && !move_promotion(m) ? m : MOVE_NONE);
break; break;
case BISHOP: case BISHOP:
return ( pos.bishop_attacks_square(from, to) return ( pos.bishop_attacks_square(from, to)
&& pos.move_is_legal(m) && pos.move_is_legal(m)
&& !move_promotion(m) ? m : MOVE_NONE); && !move_promotion(m) ? m : MOVE_NONE);
break; break;
case ROOK: case ROOK:
return ( pos.rook_attacks_square(from, to) return ( pos.rook_attacks_square(from, to)
&& pos.move_is_legal(m) && pos.move_is_legal(m)
&& !move_promotion(m) ? m : MOVE_NONE); && !move_promotion(m) ? m : MOVE_NONE);
break; break;
case QUEEN: case QUEEN:
return ( pos.queen_attacks_square(from, to) return ( pos.queen_attacks_square(from, to)
&& pos.move_is_legal(m) && pos.move_is_legal(m)
&& !move_promotion(m) ? m : MOVE_NONE); && !move_promotion(m) ? m : MOVE_NONE);
break; break;
case KING: case KING:
return ( pos.king_attacks_square(from, to) return ( pos.king_attacks_square(from, to)
&& pos.move_is_legal(m) && pos.move_is_legal(m)
&& !move_promotion(m) ? m : MOVE_NONE); && !move_promotion(m) ? m : MOVE_NONE);
break; break;
default: default:
assert(false); assert(false);
} }
assert(false); assert(false);
return MOVE_NONE; return MOVE_NONE;
} }