]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Remove xxx_of_color() for real
[stockfish] / src / position.cpp
index 275dace2a033fe259052c09d800ffc64593ae4f9..382073a7020dc2a1199cc9e5604b1d8d91c85048 100644 (file)
@@ -399,12 +399,12 @@ Bitboard Position::attacks_to(Square s) const {
 /// 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);
@@ -420,8 +420,7 @@ bool Position::piece_attacks_square(Square f, Square t) const {
 
 
 /// Position::move_attacks_square() tests whether a move from the current
-/// position attacks a given square.  Only attacks by the moving piece are
-/// considered; the function does not handle X-ray attacks.
+/// position attacks a given square.
 
 bool Position::move_attacks_square(Move m, Square s) const {
 
@@ -432,18 +431,20 @@ bool Position::move_attacks_square(Move m, Square s) const {
 
   assert(square_is_occupied(f));
 
-  switch (piece_on(f))
-  {
-  case WP:          return pawn_attacks_square(WHITE, t, s);
-  case BP:          return pawn_attacks_square(BLACK, t, s);
-  case WN: case BN: return piece_attacks_square<KNIGHT>(t, s);
-  case WB: case BB: return piece_attacks_square<BISHOP>(t, s);
-  case WR: case BR: return piece_attacks_square<ROOK>(t, s);
-  case WQ: case BQ: return piece_attacks_square<QUEEN>(t, s);
-  case WK: case BK: return piece_attacks_square<KING>(t, s);
-  default: break;
-  }
-  return false;
+  if (piece_attacks_square(piece_on(f), t, s))
+      return true;
+
+  // Move the piece and scan for X-ray attacks behind it
+  Bitboard occ = occupied_squares();
+  Color us = color_of_piece_on(f);
+  clear_bit(&occ, f);
+  set_bit(&occ, t);
+  Bitboard xray = ( (rook_attacks_bb(s, occ) & rooks_and_queens())
+                   |(bishop_attacks_bb(s, occ) & bishops_and_queens())) & pieces_of_color(us);
+
+  // If we have attacks we need to verify that are caused by our move
+  // and are not already existent ones.
+  return xray && (xray ^ (xray & piece_attacks<QUEEN>(s)));
 }
 
 
@@ -492,7 +493,7 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
   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
@@ -504,8 +505,8 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
       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);
@@ -553,7 +554,7 @@ bool Position::move_is_check(Move m, Bitboard dcCandidates) const {
   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))
@@ -665,7 +666,7 @@ bool Position::move_is_capture(Move m) const {
   assert(m != MOVE_NONE);
 
   return (   !square_is_empty(move_to(m))
-          && (color_of_piece_on(move_to(m)) == opposite_color(side_to_move()))
+          && (color_of_piece_on(move_to(m)) != color_of_piece_on(move_from(m)))
          )
          || move_is_ep(m);
 }
@@ -939,8 +940,8 @@ void Position::do_castle_move(Move m) {
   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
@@ -970,8 +971,8 @@ void Position::do_castle_move(Move m) {
 
   // Update board array
   board[kfrom] = board[rfrom] = EMPTY;
-  board[kto] = king_of_color(us);
-  board[rto] = rook_of_color(us);
+  board[kto] = piece_of_color_and_type(us, KING);
+  board[rto] = piece_of_color_and_type(us, ROOK);
 
   // Update king square
   kingSquare[us] = kto;
@@ -1038,7 +1039,7 @@ void Position::do_promotion_move(Move m, UndoInfo &u) {
   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);
@@ -1135,8 +1136,8 @@ void Position::do_ep_move(Move m) {
   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);
@@ -1313,8 +1314,8 @@ void Position::undo_castle_move(Move m) {
       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);
@@ -1334,8 +1335,8 @@ void Position::undo_castle_move(Move m) {
 
   // Update board
   board[rto] = board[kto] = EMPTY;
-  board[rfrom] = rook_of_color(us);
-  board[kfrom] = king_of_color(us);
+  board[rfrom] = piece_of_color_and_type(us, ROOK);
+  board[kfrom] = piece_of_color_and_type(us, KING);
 
   // Update king square
   kingSquare[us] = kfrom;
@@ -1386,7 +1387,7 @@ void Position::undo_promotion_move(Move m, const UndoInfo &u) {
   set_bit(&(byColorBB[us]), from);
   set_bit(&(byTypeBB[PAWN]), from);
   set_bit(&(byTypeBB[0]), from); // HACK: byTypeBB[0] == occupied squares
-  board[from] = pawn_of_color(us);
+  board[from] = piece_of_color_and_type(us, PAWN);
 
   // Update material
   npMaterial[us] -= piece_value_midgame(promotion);
@@ -1451,7 +1452,7 @@ void Position::undo_ep_move(Move m) {
 
   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);
 
@@ -1459,7 +1460,7 @@ void Position::undo_ep_move(Move m) {
   set_bit(&(byColorBB[them]), capsq);
   set_bit(&(byTypeBB[PAWN]), capsq);
   set_bit(&(byTypeBB[0]), capsq);
-  board[capsq] = pawn_of_color(them);
+  board[capsq] = piece_of_color_and_type(them, PAWN);
 
   // Remove moving piece from destination square
   clear_bit(&(byColorBB[us]), to);
@@ -1471,7 +1472,7 @@ void Position::undo_ep_move(Move m) {
   set_bit(&(byColorBB[us]), from);
   set_bit(&(byTypeBB[PAWN]), from);
   set_bit(&(byTypeBB[0]), from);
-  board[from] = pawn_of_color(us);
+  board[from] = piece_of_color_and_type(us, PAWN);
 
   // Update piece list:
   pieceList[us][PAWN][index[to]] = from;