/// Position::piece_attacks_square() tests whether the piece on square f
/// attacks square t.
-bool Position::piece_attacks_square(Square f, Square t) const {
+bool Position::piece_attacks_square(Piece p, Square f, Square t) const {
assert(square_is_ok(f));
assert(square_is_ok(t));
- switch (piece_on(f))
+ switch (p)
{
case WP: return pawn_attacks_square(WHITE, f, t);
case BP: return pawn_attacks_square(BLACK, f, t);
assert(move_is_ok(m));
assert(square_is_ok(s));
- bool is_attack;
Square f = move_from(m), t = move_to(m);
assert(square_is_occupied(f));
- switch (piece_on(f))
- {
- case WP: is_attack = pawn_attacks_square(WHITE, t, s); break;
- case BP: is_attack = pawn_attacks_square(BLACK, t, s); break;
- case WN: case BN: is_attack = piece_attacks_square<KNIGHT>(t, s); break;
- case WB: case BB: is_attack = piece_attacks_square<BISHOP>(t, s); break;
- case WR: case BR: is_attack = piece_attacks_square<ROOK>(t, s); break;
- case WQ: case BQ: is_attack = piece_attacks_square<QUEEN>(t, s); break;
- case WK: case BK: is_attack = piece_attacks_square<KING>(t, s); break;
- default: break;
- }
-
- if (is_attack)
+ if (piece_attacks_square(piece_on(f), t, s))
return true;
// Move the piece and scan for X-ray attacks behind it
Square ksq = king_square(us);
assert(color_of_piece_on(from) == us);
- assert(piece_on(ksq) == king_of_color(us));
+ assert(piece_on(ksq) == piece_of_color_and_type(us, KING));
// En passant captures are a tricky special case. Because they are
// rather uncommon, we do it simply by testing whether the king is attacked
Bitboard b = occupied_squares();
assert(to == ep_square());
- assert(piece_on(from) == pawn_of_color(us));
- assert(piece_on(capsq) == pawn_of_color(them));
+ assert(piece_on(from) == piece_of_color_and_type(us, PAWN));
+ assert(piece_on(capsq) == piece_of_color_and_type(them, PAWN));
assert(piece_on(to) == EMPTY);
clear_bit(&b, from);
Square ksq = king_square(them);
assert(color_of_piece_on(from) == us);
- assert(piece_on(ksq) == king_of_color(them));
+ assert(piece_on(ksq) == piece_of_color_and_type(them, KING));
// Proceed according to the type of the moving piece
switch (type_of_piece_on(from))
Square rfrom = move_to(m); // HACK: See comment at beginning of function
Square kto, rto;
- assert(piece_on(kfrom) == king_of_color(us));
- assert(piece_on(rfrom) == rook_of_color(us));
+ assert(piece_on(kfrom) == piece_of_color_and_type(us, KING));
+ assert(piece_on(rfrom) == piece_of_color_and_type(us, ROOK));
// Find destination squares for king and rook
if (rfrom > kfrom) // O-O
to = move_to(m);
assert(relative_rank(us, to) == RANK_8);
- assert(piece_on(from) == pawn_of_color(us));
+ assert(piece_on(from) == piece_of_color_and_type(us, PAWN));
assert(color_of_piece_on(to) == them || square_is_empty(to));
capture = type_of_piece_on(to);
assert(to == epSquare);
assert(relative_rank(us, to) == RANK_6);
assert(piece_on(to) == EMPTY);
- assert(piece_on(from) == pawn_of_color(us));
- assert(piece_on(capsq) == pawn_of_color(them));
+ assert(piece_on(from) == piece_of_color_and_type(us, PAWN));
+ assert(piece_on(capsq) == piece_of_color_and_type(them, PAWN));
// Remove captured piece
clear_bit(&(byColorBB[them]), capsq);
rto = relative_square(us, SQ_D1);
}
- assert(piece_on(kto) == king_of_color(us));
- assert(piece_on(rto) == rook_of_color(us));
+ assert(piece_on(kto) == piece_of_color_and_type(us, KING));
+ assert(piece_on(rto) == piece_of_color_and_type(us, ROOK));
// Remove pieces from destination squares
clear_bit(&(byColorBB[us]), kto);
assert(to == ep_square());
assert(relative_rank(us, to) == RANK_6);
- assert(piece_on(to) == pawn_of_color(us));
+ assert(piece_on(to) == piece_of_color_and_type(us, PAWN));
assert(piece_on(from) == EMPTY);
assert(piece_on(capsq) == EMPTY);