]> git.sesse.net Git - stockfish/blob - src/position.cpp
pseudo_legal() and MOVE_NONE
[stockfish] / src / position.cpp
1 /*
2   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4   Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
5   Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
6
7   Stockfish is free software: you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   Stockfish is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include <algorithm>
22 #include <cassert>
23 #include <cstddef> // For offsetof()
24 #include <cstring> // For std::memset, std::memcmp
25 #include <iomanip>
26 #include <sstream>
27
28 #include "bitboard.h"
29 #include "misc.h"
30 #include "movegen.h"
31 #include "position.h"
32 #include "thread.h"
33 #include "tt.h"
34 #include "uci.h"
35 #include "syzygy/tbprobe.h"
36
37 using std::string;
38
39 namespace Zobrist {
40
41   Key psq[PIECE_NB][SQUARE_NB];
42   Key enpassant[FILE_NB];
43   Key castling[CASTLING_RIGHT_NB];
44   Key side, noPawns;
45 }
46
47 namespace {
48
49 const string PieceToChar(" PNBRQK  pnbrqk");
50
51 constexpr Piece Pieces[] = { W_PAWN, W_KNIGHT, W_BISHOP, W_ROOK, W_QUEEN, W_KING,
52                              B_PAWN, B_KNIGHT, B_BISHOP, B_ROOK, B_QUEEN, B_KING };
53
54 // min_attacker() is a helper function used by see_ge() to locate the least
55 // valuable attacker for the side to move, remove the attacker we just found
56 // from the bitboards and scan for new X-ray attacks behind it.
57
58 template<int Pt>
59 PieceType min_attacker(const Bitboard* byTypeBB, Square to, Bitboard stmAttackers,
60                        Bitboard& occupied, Bitboard& attackers) {
61
62   Bitboard b = stmAttackers & byTypeBB[Pt];
63   if (!b)
64       return min_attacker<Pt + 1>(byTypeBB, to, stmAttackers, occupied, attackers);
65
66   occupied ^= lsb(b); // Remove the attacker from occupied
67
68   // Add any X-ray attack behind the just removed piece. For instance with
69   // rooks in a8 and a7 attacking a1, after removing a7 we add rook in a8.
70   // Note that new added attackers can be of any color.
71   if (Pt == PAWN || Pt == BISHOP || Pt == QUEEN)
72       attackers |= attacks_bb<BISHOP>(to, occupied) & (byTypeBB[BISHOP] | byTypeBB[QUEEN]);
73
74   if (Pt == ROOK || Pt == QUEEN)
75       attackers |= attacks_bb<ROOK>(to, occupied) & (byTypeBB[ROOK] | byTypeBB[QUEEN]);
76
77   // X-ray may add already processed pieces because byTypeBB[] is constant: in
78   // the rook example, now attackers contains _again_ rook in a7, so remove it.
79   attackers &= occupied;
80   return (PieceType)Pt;
81 }
82
83 template<>
84 PieceType min_attacker<KING>(const Bitboard*, Square, Bitboard, Bitboard&, Bitboard&) {
85   return KING; // No need to update bitboards: it is the last cycle
86 }
87
88 } // namespace
89
90
91 /// operator<<(Position) returns an ASCII representation of the position
92
93 std::ostream& operator<<(std::ostream& os, const Position& pos) {
94
95   os << "\n +---+---+---+---+---+---+---+---+\n";
96
97   for (Rank r = RANK_8; r >= RANK_1; --r)
98   {
99       for (File f = FILE_A; f <= FILE_H; ++f)
100           os << " | " << PieceToChar[pos.piece_on(make_square(f, r))];
101
102       os << " |\n +---+---+---+---+---+---+---+---+\n";
103   }
104
105   os << "\nFen: " << pos.fen() << "\nKey: " << std::hex << std::uppercase
106      << std::setfill('0') << std::setw(16) << pos.key()
107      << std::setfill(' ') << std::dec << "\nCheckers: ";
108
109   for (Bitboard b = pos.checkers(); b; )
110       os << UCI::square(pop_lsb(&b)) << " ";
111
112   if (    int(Tablebases::MaxCardinality) >= popcount(pos.pieces())
113       && !pos.can_castle(ANY_CASTLING))
114   {
115       StateInfo st;
116       Position p;
117       p.set(pos.fen(), pos.is_chess960(), &st, pos.this_thread());
118       Tablebases::ProbeState s1, s2;
119       Tablebases::WDLScore wdl = Tablebases::probe_wdl(p, &s1);
120       int dtz = Tablebases::probe_dtz(p, &s2);
121       os << "\nTablebases WDL: " << std::setw(4) << wdl << " (" << s1 << ")"
122          << "\nTablebases DTZ: " << std::setw(4) << dtz << " (" << s2 << ")";
123   }
124
125   return os;
126 }
127
128
129 // Marcel van Kervinck's cuckoo algorithm for fast detection of "upcoming repetition"
130 // situations. Description of the algorithm in the following paper:
131 // https://marcelk.net/2013-04-06/paper/upcoming-rep-v2.pdf
132
133 // First and second hash functions for indexing the cuckoo tables
134 inline int H1(Key h) { return h & 0x1fff; }
135 inline int H2(Key h) { return (h >> 16) & 0x1fff; }
136
137 // Cuckoo tables with Zobrist hashes of valid reversible moves, and the moves themselves
138 Key cuckoo[8192];
139 Move cuckooMove[8192];
140
141
142 /// Position::init() initializes at startup the various arrays used to compute
143 /// hash keys.
144
145 void Position::init() {
146
147   PRNG rng(1070372);
148
149   for (Piece pc : Pieces)
150       for (Square s = SQ_A1; s <= SQ_H8; ++s)
151           Zobrist::psq[pc][s] = rng.rand<Key>();
152
153   for (File f = FILE_A; f <= FILE_H; ++f)
154       Zobrist::enpassant[f] = rng.rand<Key>();
155
156   for (int cr = NO_CASTLING; cr <= ANY_CASTLING; ++cr)
157   {
158       Zobrist::castling[cr] = 0;
159       Bitboard b = cr;
160       while (b)
161       {
162           Key k = Zobrist::castling[1ULL << pop_lsb(&b)];
163           Zobrist::castling[cr] ^= k ? k : rng.rand<Key>();
164       }
165   }
166
167   Zobrist::side = rng.rand<Key>();
168   Zobrist::noPawns = rng.rand<Key>();
169
170   // Prepare the cuckoo tables
171   std::memset(cuckoo, 0, sizeof(cuckoo));
172   std::memset(cuckooMove, 0, sizeof(cuckooMove));
173   int count = 0;
174   for (Piece pc : Pieces)
175       for (Square s1 = SQ_A1; s1 <= SQ_H8; ++s1)
176           for (Square s2 = Square(s1 + 1); s2 <= SQ_H8; ++s2)
177               if (PseudoAttacks[type_of(pc)][s1] & s2)
178               {
179                   Move move = make_move(s1, s2);
180                   Key key = Zobrist::psq[pc][s1] ^ Zobrist::psq[pc][s2] ^ Zobrist::side;
181                   int i = H1(key);
182                   while (true)
183                   {
184                       std::swap(cuckoo[i], key);
185                       std::swap(cuckooMove[i], move);
186                       if (move == 0)   // Arrived at empty slot ?
187                           break;
188                       i = (i == H1(key)) ? H2(key) : H1(key); // Push victim to alternative slot
189                   }
190                   count++;
191              }
192   assert(count == 3668);
193 }
194
195
196 /// Position::set() initializes the position object with the given FEN string.
197 /// This function is not very robust - make sure that input FENs are correct,
198 /// this is assumed to be the responsibility of the GUI.
199
200 Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Thread* th) {
201 /*
202    A FEN string defines a particular position using only the ASCII character set.
203
204    A FEN string contains six fields separated by a space. The fields are:
205
206    1) Piece placement (from white's perspective). Each rank is described, starting
207       with rank 8 and ending with rank 1. Within each rank, the contents of each
208       square are described from file A through file H. Following the Standard
209       Algebraic Notation (SAN), each piece is identified by a single letter taken
210       from the standard English names. White pieces are designated using upper-case
211       letters ("PNBRQK") whilst Black uses lowercase ("pnbrqk"). Blank squares are
212       noted using digits 1 through 8 (the number of blank squares), and "/"
213       separates ranks.
214
215    2) Active color. "w" means white moves next, "b" means black.
216
217    3) Castling availability. If neither side can castle, this is "-". Otherwise,
218       this has one or more letters: "K" (White can castle kingside), "Q" (White
219       can castle queenside), "k" (Black can castle kingside), and/or "q" (Black
220       can castle queenside).
221
222    4) En passant target square (in algebraic notation). If there's no en passant
223       target square, this is "-". If a pawn has just made a 2-square move, this
224       is the position "behind" the pawn. This is recorded only if there is a pawn
225       in position to make an en passant capture, and if there really is a pawn
226       that might have advanced two squares.
227
228    5) Halfmove clock. This is the number of halfmoves since the last pawn advance
229       or capture. This is used to determine if a draw can be claimed under the
230       fifty-move rule.
231
232    6) Fullmove number. The number of the full move. It starts at 1, and is
233       incremented after Black's move.
234 */
235
236   unsigned char col, row, token;
237   size_t idx;
238   Square sq = SQ_A8;
239   std::istringstream ss(fenStr);
240
241   std::memset(this, 0, sizeof(Position));
242   std::memset(si, 0, sizeof(StateInfo));
243   std::fill_n(&pieceList[0][0], sizeof(pieceList) / sizeof(Square), SQ_NONE);
244   st = si;
245
246   ss >> std::noskipws;
247
248   // 1. Piece placement
249   while ((ss >> token) && !isspace(token))
250   {
251       if (isdigit(token))
252           sq += (token - '0') * EAST; // Advance the given number of files
253
254       else if (token == '/')
255           sq += 2 * SOUTH;
256
257       else if ((idx = PieceToChar.find(token)) != string::npos)
258       {
259           put_piece(Piece(idx), sq);
260           ++sq;
261       }
262   }
263
264   // 2. Active color
265   ss >> token;
266   sideToMove = (token == 'w' ? WHITE : BLACK);
267   ss >> token;
268
269   // 3. Castling availability. Compatible with 3 standards: Normal FEN standard,
270   // Shredder-FEN that uses the letters of the columns on which the rooks began
271   // the game instead of KQkq and also X-FEN standard that, in case of Chess960,
272   // if an inner rook is associated with the castling right, the castling tag is
273   // replaced by the file letter of the involved rook, as for the Shredder-FEN.
274   while ((ss >> token) && !isspace(token))
275   {
276       Square rsq;
277       Color c = islower(token) ? BLACK : WHITE;
278       Piece rook = make_piece(c, ROOK);
279
280       token = char(toupper(token));
281
282       if (token == 'K')
283           for (rsq = relative_square(c, SQ_H1); piece_on(rsq) != rook; --rsq) {}
284
285       else if (token == 'Q')
286           for (rsq = relative_square(c, SQ_A1); piece_on(rsq) != rook; ++rsq) {}
287
288       else if (token >= 'A' && token <= 'H')
289           rsq = make_square(File(token - 'A'), relative_rank(c, RANK_1));
290
291       else
292           continue;
293
294       set_castling_right(c, rsq);
295   }
296
297   // 4. En passant square. Ignore if no pawn capture is possible
298   if (   ((ss >> col) && (col >= 'a' && col <= 'h'))
299       && ((ss >> row) && (row == '3' || row == '6')))
300   {
301       st->epSquare = make_square(File(col - 'a'), Rank(row - '1'));
302
303       if (   !(attackers_to(st->epSquare) & pieces(sideToMove, PAWN))
304           || !(pieces(~sideToMove, PAWN) & (st->epSquare + pawn_push(~sideToMove))))
305           st->epSquare = SQ_NONE;
306   }
307   else
308       st->epSquare = SQ_NONE;
309
310   // 5-6. Halfmove clock and fullmove number
311   ss >> std::skipws >> st->rule50 >> gamePly;
312
313   // Convert from fullmove starting from 1 to gamePly starting from 0,
314   // handle also common incorrect FEN with fullmove = 0.
315   gamePly = std::max(2 * (gamePly - 1), 0) + (sideToMove == BLACK);
316
317   chess960 = isChess960;
318   thisThread = th;
319   set_state(st);
320
321   assert(pos_is_ok());
322
323   return *this;
324 }
325
326
327 /// Position::set_castling_right() is a helper function used to set castling
328 /// rights given the corresponding color and the rook starting square.
329
330 void Position::set_castling_right(Color c, Square rfrom) {
331
332   Square kfrom = square<KING>(c);
333   CastlingSide cs = kfrom < rfrom ? KING_SIDE : QUEEN_SIDE;
334   CastlingRight cr = (c | cs);
335
336   st->castlingRights |= cr;
337   castlingRightsMask[kfrom] |= cr;
338   castlingRightsMask[rfrom] |= cr;
339   castlingRookSquare[cr] = rfrom;
340
341   Square kto = relative_square(c, cs == KING_SIDE ? SQ_G1 : SQ_C1);
342   Square rto = relative_square(c, cs == KING_SIDE ? SQ_F1 : SQ_D1);
343
344   for (Square s = std::min(rfrom, rto); s <= std::max(rfrom, rto); ++s)
345       if (s != kfrom && s != rfrom)
346           castlingPath[cr] |= s;
347
348   for (Square s = std::min(kfrom, kto); s <= std::max(kfrom, kto); ++s)
349       if (s != kfrom && s != rfrom)
350           castlingPath[cr] |= s;
351 }
352
353
354 /// Position::set_check_info() sets king attacks to detect if a move gives check
355
356 void Position::set_check_info(StateInfo* si) const {
357
358   si->blockersForKing[WHITE] = slider_blockers(pieces(BLACK), square<KING>(WHITE), si->pinners[BLACK]);
359   si->blockersForKing[BLACK] = slider_blockers(pieces(WHITE), square<KING>(BLACK), si->pinners[WHITE]);
360
361   Square ksq = square<KING>(~sideToMove);
362
363   si->checkSquares[PAWN]   = attacks_from<PAWN>(ksq, ~sideToMove);
364   si->checkSquares[KNIGHT] = attacks_from<KNIGHT>(ksq);
365   si->checkSquares[BISHOP] = attacks_from<BISHOP>(ksq);
366   si->checkSquares[ROOK]   = attacks_from<ROOK>(ksq);
367   si->checkSquares[QUEEN]  = si->checkSquares[BISHOP] | si->checkSquares[ROOK];
368   si->checkSquares[KING]   = 0;
369 }
370
371
372 /// Position::set_state() computes the hash keys of the position, and other
373 /// data that once computed is updated incrementally as moves are made.
374 /// The function is only used when a new position is set up, and to verify
375 /// the correctness of the StateInfo data when running in debug mode.
376
377 void Position::set_state(StateInfo* si) const {
378
379   si->key = si->materialKey = 0;
380   si->pawnKey = Zobrist::noPawns;
381   si->nonPawnMaterial[WHITE] = si->nonPawnMaterial[BLACK] = VALUE_ZERO;
382   si->checkersBB = attackers_to(square<KING>(sideToMove)) & pieces(~sideToMove);
383
384   set_check_info(si);
385
386   for (Bitboard b = pieces(); b; )
387   {
388       Square s = pop_lsb(&b);
389       Piece pc = piece_on(s);
390       si->key ^= Zobrist::psq[pc][s];
391   }
392
393   if (si->epSquare != SQ_NONE)
394       si->key ^= Zobrist::enpassant[file_of(si->epSquare)];
395
396   if (sideToMove == BLACK)
397       si->key ^= Zobrist::side;
398
399   si->key ^= Zobrist::castling[si->castlingRights];
400
401   for (Bitboard b = pieces(PAWN); b; )
402   {
403       Square s = pop_lsb(&b);
404       si->pawnKey ^= Zobrist::psq[piece_on(s)][s];
405   }
406
407   for (Piece pc : Pieces)
408   {
409       if (type_of(pc) != PAWN && type_of(pc) != KING)
410           si->nonPawnMaterial[color_of(pc)] += pieceCount[pc] * PieceValue[MG][pc];
411
412       for (int cnt = 0; cnt < pieceCount[pc]; ++cnt)
413           si->materialKey ^= Zobrist::psq[pc][cnt];
414   }
415 }
416
417
418 /// Position::set() is an overload to initialize the position object with
419 /// the given endgame code string like "KBPKN". It is mainly a helper to
420 /// get the material key out of an endgame code.
421
422 Position& Position::set(const string& code, Color c, StateInfo* si) {
423
424   assert(code.length() > 0 && code.length() < 8);
425   assert(code[0] == 'K');
426
427   string sides[] = { code.substr(code.find('K', 1)),      // Weak
428                      code.substr(0, code.find('K', 1)) }; // Strong
429
430   std::transform(sides[c].begin(), sides[c].end(), sides[c].begin(), tolower);
431
432   string fenStr = "8/" + sides[0] + char(8 - sides[0].length() + '0') + "/8/8/8/8/"
433                        + sides[1] + char(8 - sides[1].length() + '0') + "/8 w - - 0 10";
434
435   return set(fenStr, false, si, nullptr);
436 }
437
438
439 /// Position::fen() returns a FEN representation of the position. In case of
440 /// Chess960 the Shredder-FEN notation is used. This is mainly a debugging function.
441
442 const string Position::fen() const {
443
444   int emptyCnt;
445   std::ostringstream ss;
446
447   for (Rank r = RANK_8; r >= RANK_1; --r)
448   {
449       for (File f = FILE_A; f <= FILE_H; ++f)
450       {
451           for (emptyCnt = 0; f <= FILE_H && empty(make_square(f, r)); ++f)
452               ++emptyCnt;
453
454           if (emptyCnt)
455               ss << emptyCnt;
456
457           if (f <= FILE_H)
458               ss << PieceToChar[piece_on(make_square(f, r))];
459       }
460
461       if (r > RANK_1)
462           ss << '/';
463   }
464
465   ss << (sideToMove == WHITE ? " w " : " b ");
466
467   if (can_castle(WHITE_OO))
468       ss << (chess960 ? char('A' + file_of(castling_rook_square(WHITE |  KING_SIDE))) : 'K');
469
470   if (can_castle(WHITE_OOO))
471       ss << (chess960 ? char('A' + file_of(castling_rook_square(WHITE | QUEEN_SIDE))) : 'Q');
472
473   if (can_castle(BLACK_OO))
474       ss << (chess960 ? char('a' + file_of(castling_rook_square(BLACK |  KING_SIDE))) : 'k');
475
476   if (can_castle(BLACK_OOO))
477       ss << (chess960 ? char('a' + file_of(castling_rook_square(BLACK | QUEEN_SIDE))) : 'q');
478
479   if (!can_castle(WHITE) && !can_castle(BLACK))
480       ss << '-';
481
482   ss << (ep_square() == SQ_NONE ? " - " : " " + UCI::square(ep_square()) + " ")
483      << st->rule50 << " " << 1 + (gamePly - (sideToMove == BLACK)) / 2;
484
485   return ss.str();
486 }
487
488
489 /// Position::slider_blockers() returns a bitboard of all the pieces (both colors)
490 /// that are blocking attacks on the square 's' from 'sliders'. A piece blocks a
491 /// slider if removing that piece from the board would result in a position where
492 /// square 's' is attacked. For example, a king-attack blocking piece can be either
493 /// a pinned or a discovered check piece, according if its color is the opposite
494 /// or the same of the color of the slider.
495
496 Bitboard Position::slider_blockers(Bitboard sliders, Square s, Bitboard& pinners) const {
497
498   Bitboard blockers = 0;
499   pinners = 0;
500
501   // Snipers are sliders that attack 's' when a piece is removed
502   Bitboard snipers = (  (PseudoAttacks[  ROOK][s] & pieces(QUEEN, ROOK))
503                       | (PseudoAttacks[BISHOP][s] & pieces(QUEEN, BISHOP))) & sliders;
504
505   while (snipers)
506   {
507     Square sniperSq = pop_lsb(&snipers);
508     Bitboard b = between_bb(s, sniperSq) & pieces();
509
510     if (b && !more_than_one(b))
511     {
512         blockers |= b;
513         if (b & pieces(color_of(piece_on(s))))
514             pinners |= sniperSq;
515     }
516   }
517   return blockers;
518 }
519
520
521 /// Position::attackers_to() computes a bitboard of all pieces which attack a
522 /// given square. Slider attacks use the occupied bitboard to indicate occupancy.
523
524 Bitboard Position::attackers_to(Square s, Bitboard occupied) const {
525
526   return  (attacks_from<PAWN>(s, BLACK)    & pieces(WHITE, PAWN))
527         | (attacks_from<PAWN>(s, WHITE)    & pieces(BLACK, PAWN))
528         | (attacks_from<KNIGHT>(s)         & pieces(KNIGHT))
529         | (attacks_bb<  ROOK>(s, occupied) & pieces(  ROOK, QUEEN))
530         | (attacks_bb<BISHOP>(s, occupied) & pieces(BISHOP, QUEEN))
531         | (attacks_from<KING>(s)           & pieces(KING));
532 }
533
534
535 /// Position::legal() tests whether a pseudo-legal move is legal
536
537 bool Position::legal(Move m) const {
538
539   assert(is_ok(m));
540
541   Color us = sideToMove;
542   Square from = from_sq(m);
543
544   assert(color_of(moved_piece(m)) == us);
545   assert(piece_on(square<KING>(us)) == make_piece(us, KING));
546
547   // En passant captures are a tricky special case. Because they are rather
548   // uncommon, we do it simply by testing whether the king is attacked after
549   // the move is made.
550   if (type_of(m) == ENPASSANT)
551   {
552       Square ksq = square<KING>(us);
553       Square to = to_sq(m);
554       Square capsq = to - pawn_push(us);
555       Bitboard occupied = (pieces() ^ from ^ capsq) | to;
556
557       assert(to == ep_square());
558       assert(moved_piece(m) == make_piece(us, PAWN));
559       assert(piece_on(capsq) == make_piece(~us, PAWN));
560       assert(piece_on(to) == NO_PIECE);
561
562       return   !(attacks_bb<  ROOK>(ksq, occupied) & pieces(~us, QUEEN, ROOK))
563             && !(attacks_bb<BISHOP>(ksq, occupied) & pieces(~us, QUEEN, BISHOP));
564   }
565
566   // If the moving piece is a king, check whether the destination
567   // square is attacked by the opponent. Castling moves are checked
568   // for legality during move generation.
569   if (type_of(piece_on(from)) == KING)
570       return type_of(m) == CASTLING || !(attackers_to(to_sq(m)) & pieces(~us));
571
572   // A non-king move is legal if and only if it is not pinned or it
573   // is moving along the ray towards or away from the king.
574   return   !(blockers_for_king(us) & from)
575         ||  aligned(from, to_sq(m), square<KING>(us));
576 }
577
578
579 /// Position::pseudo_legal() takes a random move and tests whether the move is
580 /// pseudo legal. It is used to validate moves from TT that can be corrupted
581 /// due to SMP concurrent access or hash position key aliasing.
582 /// MOVE_NONE is represented as SQ_A1 to SQ_A1 which is never pseudo_legal.
583
584 bool Position::pseudo_legal(const Move m) const {
585
586   Color us = sideToMove;
587   Square from = from_sq(m);
588   Square to = to_sq(m);
589   Piece pc = moved_piece(m);
590
591   // Use a slower but simpler function for uncommon cases
592   if (type_of(m) != NORMAL)
593       return MoveList<LEGAL>(*this).contains(m);
594
595   // Is not a promotion, so promotion piece must be empty
596   if (promotion_type(m) - KNIGHT != NO_PIECE_TYPE)
597       return false;
598
599   // If the 'from' square is not occupied by a piece belonging to the side to
600   // move, the move is obviously not legal.
601   if (pc == NO_PIECE || color_of(pc) != us)
602       return false;
603
604   // The destination square cannot be occupied by a friendly piece
605   if (pieces(us) & to)
606       return false;
607
608   // Handle the special case of a pawn move
609   if (type_of(pc) == PAWN)
610   {
611       // We have already handled promotion moves, so destination
612       // cannot be on the 8th/1st rank.
613       if (rank_of(to) == relative_rank(us, RANK_8))
614           return false;
615
616       if (   !(attacks_from<PAWN>(from, us) & pieces(~us) & to) // Not a capture
617           && !((from + pawn_push(us) == to) && empty(to))       // Not a single push
618           && !(   (from + 2 * pawn_push(us) == to)              // Not a double push
619                && (rank_of(from) == relative_rank(us, RANK_2))
620                && empty(to)
621                && empty(to - pawn_push(us))))
622           return false;
623   }
624   else if (!(attacks_from(type_of(pc), from) & to))
625       return false;
626
627   // Evasions generator already takes care to avoid some kind of illegal moves
628   // and legal() relies on this. We therefore have to take care that the same
629   // kind of moves are filtered out here.
630   if (checkers())
631   {
632       if (type_of(pc) != KING)
633       {
634           // Double check? In this case a king move is required
635           if (more_than_one(checkers()))
636               return false;
637
638           // Our move must be a blocking evasion or a capture of the checking piece
639           if (!((between_bb(lsb(checkers()), square<KING>(us)) | checkers()) & to))
640               return false;
641       }
642       // In case of king moves under check we have to remove king so as to catch
643       // invalid moves like b1a1 when opposite queen is on c1.
644       else if (attackers_to(to, pieces() ^ from) & pieces(~us))
645           return false;
646   }
647
648   return true;
649 }
650
651
652 /// Position::gives_check() tests whether a pseudo-legal move gives a check
653
654 bool Position::gives_check(Move m) const {
655
656   assert(is_ok(m));
657   assert(color_of(moved_piece(m)) == sideToMove);
658
659   Square from = from_sq(m);
660   Square to = to_sq(m);
661
662   // Is there a direct check?
663   if (st->checkSquares[type_of(piece_on(from))] & to)
664       return true;
665
666   // Is there a discovered check?
667   if (   (st->blockersForKing[~sideToMove] & from)
668       && !aligned(from, to, square<KING>(~sideToMove)))
669       return true;
670
671   switch (type_of(m))
672   {
673   case NORMAL:
674       return false;
675
676   case PROMOTION:
677       return attacks_bb(promotion_type(m), to, pieces() ^ from) & square<KING>(~sideToMove);
678
679   // En passant capture with check? We have already handled the case
680   // of direct checks and ordinary discovered check, so the only case we
681   // need to handle is the unusual case of a discovered check through
682   // the captured pawn.
683   case ENPASSANT:
684   {
685       Square capsq = make_square(file_of(to), rank_of(from));
686       Bitboard b = (pieces() ^ from ^ capsq) | to;
687
688       return  (attacks_bb<  ROOK>(square<KING>(~sideToMove), b) & pieces(sideToMove, QUEEN, ROOK))
689             | (attacks_bb<BISHOP>(square<KING>(~sideToMove), b) & pieces(sideToMove, QUEEN, BISHOP));
690   }
691   case CASTLING:
692   {
693       Square kfrom = from;
694       Square rfrom = to; // Castling is encoded as 'King captures the rook'
695       Square kto = relative_square(sideToMove, rfrom > kfrom ? SQ_G1 : SQ_C1);
696       Square rto = relative_square(sideToMove, rfrom > kfrom ? SQ_F1 : SQ_D1);
697
698       return   (PseudoAttacks[ROOK][rto] & square<KING>(~sideToMove))
699             && (attacks_bb<ROOK>(rto, (pieces() ^ kfrom ^ rfrom) | rto | kto) & square<KING>(~sideToMove));
700   }
701   default:
702       assert(false);
703       return false;
704   }
705 }
706
707
708 /// Position::do_move() makes a move, and saves all information necessary
709 /// to a StateInfo object. The move is assumed to be legal. Pseudo-legal
710 /// moves should be filtered out before this function is called.
711
712 void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
713
714   assert(is_ok(m));
715   assert(&newSt != st);
716
717   thisThread->nodes.fetch_add(1, std::memory_order_relaxed);
718   Key k = st->key ^ Zobrist::side;
719
720   // Copy some fields of the old state to our new StateInfo object except the
721   // ones which are going to be recalculated from scratch anyway and then switch
722   // our state pointer to point to the new (ready to be updated) state.
723   std::memcpy(&newSt, st, offsetof(StateInfo, key));
724   newSt.previous = st;
725   st = &newSt;
726
727   // Increment ply counters. In particular, rule50 will be reset to zero later on
728   // in case of a capture or a pawn move.
729   ++gamePly;
730   ++st->rule50;
731   ++st->pliesFromNull;
732
733   Color us = sideToMove;
734   Color them = ~us;
735   Square from = from_sq(m);
736   Square to = to_sq(m);
737   Piece pc = piece_on(from);
738   Piece captured = type_of(m) == ENPASSANT ? make_piece(them, PAWN) : piece_on(to);
739
740   assert(color_of(pc) == us);
741   assert(captured == NO_PIECE || color_of(captured) == (type_of(m) != CASTLING ? them : us));
742   assert(type_of(captured) != KING);
743
744   if (type_of(m) == CASTLING)
745   {
746       assert(pc == make_piece(us, KING));
747       assert(captured == make_piece(us, ROOK));
748
749       Square rfrom, rto;
750       do_castling<true>(us, from, to, rfrom, rto);
751
752       k ^= Zobrist::psq[captured][rfrom] ^ Zobrist::psq[captured][rto];
753       captured = NO_PIECE;
754   }
755
756   if (captured)
757   {
758       Square capsq = to;
759
760       // If the captured piece is a pawn, update pawn hash key, otherwise
761       // update non-pawn material.
762       if (type_of(captured) == PAWN)
763       {
764           if (type_of(m) == ENPASSANT)
765           {
766               capsq -= pawn_push(us);
767
768               assert(pc == make_piece(us, PAWN));
769               assert(to == st->epSquare);
770               assert(relative_rank(us, to) == RANK_6);
771               assert(piece_on(to) == NO_PIECE);
772               assert(piece_on(capsq) == make_piece(them, PAWN));
773
774               board[capsq] = NO_PIECE; // Not done by remove_piece()
775           }
776
777           st->pawnKey ^= Zobrist::psq[captured][capsq];
778       }
779       else
780           st->nonPawnMaterial[them] -= PieceValue[MG][captured];
781
782       // Update board and piece lists
783       remove_piece(captured, capsq);
784
785       // Update material hash key and prefetch access to materialTable
786       k ^= Zobrist::psq[captured][capsq];
787       st->materialKey ^= Zobrist::psq[captured][pieceCount[captured]];
788       prefetch(thisThread->materialTable[st->materialKey]);
789
790       // Reset rule 50 counter
791       st->rule50 = 0;
792   }
793
794   // Update hash key
795   k ^= Zobrist::psq[pc][from] ^ Zobrist::psq[pc][to];
796
797   // Reset en passant square
798   if (st->epSquare != SQ_NONE)
799   {
800       k ^= Zobrist::enpassant[file_of(st->epSquare)];
801       st->epSquare = SQ_NONE;
802   }
803
804   // Update castling rights if needed
805   if (st->castlingRights && (castlingRightsMask[from] | castlingRightsMask[to]))
806   {
807       int cr = castlingRightsMask[from] | castlingRightsMask[to];
808       k ^= Zobrist::castling[st->castlingRights & cr];
809       st->castlingRights &= ~cr;
810   }
811
812   // Move the piece. The tricky Chess960 castling is handled earlier
813   if (type_of(m) != CASTLING)
814       move_piece(pc, from, to);
815
816   // If the moving piece is a pawn do some special extra work
817   if (type_of(pc) == PAWN)
818   {
819       // Set en-passant square if the moved pawn can be captured
820       if (   (int(to) ^ int(from)) == 16
821           && (attacks_from<PAWN>(to - pawn_push(us), us) & pieces(them, PAWN)))
822       {
823           st->epSquare = to - pawn_push(us);
824           k ^= Zobrist::enpassant[file_of(st->epSquare)];
825       }
826
827       else if (type_of(m) == PROMOTION)
828       {
829           Piece promotion = make_piece(us, promotion_type(m));
830
831           assert(relative_rank(us, to) == RANK_8);
832           assert(type_of(promotion) >= KNIGHT && type_of(promotion) <= QUEEN);
833
834           remove_piece(pc, to);
835           put_piece(promotion, to);
836
837           // Update hash keys
838           k ^= Zobrist::psq[pc][to] ^ Zobrist::psq[promotion][to];
839           st->pawnKey ^= Zobrist::psq[pc][to];
840           st->materialKey ^=  Zobrist::psq[promotion][pieceCount[promotion]-1]
841                             ^ Zobrist::psq[pc][pieceCount[pc]];
842
843           // Update material
844           st->nonPawnMaterial[us] += PieceValue[MG][promotion];
845       }
846
847       // Update pawn hash key and prefetch access to pawnsTable
848       st->pawnKey ^= Zobrist::psq[pc][from] ^ Zobrist::psq[pc][to];
849       prefetch2(thisThread->pawnsTable[st->pawnKey]);
850
851       // Reset rule 50 draw counter
852       st->rule50 = 0;
853   }
854
855   // Set capture piece
856   st->capturedPiece = captured;
857
858   // Update the key with the final value
859   st->key = k;
860
861   // Calculate checkers bitboard (if move gives check)
862   st->checkersBB = givesCheck ? attackers_to(square<KING>(them)) & pieces(us) : 0;
863
864   sideToMove = ~sideToMove;
865
866   // Update king attacks used for fast check detection
867   set_check_info(st);
868
869   assert(pos_is_ok());
870 }
871
872
873 /// Position::undo_move() unmakes a move. When it returns, the position should
874 /// be restored to exactly the same state as before the move was made.
875
876 void Position::undo_move(Move m) {
877
878   assert(is_ok(m));
879
880   sideToMove = ~sideToMove;
881
882   Color us = sideToMove;
883   Square from = from_sq(m);
884   Square to = to_sq(m);
885   Piece pc = piece_on(to);
886
887   assert(empty(from) || type_of(m) == CASTLING);
888   assert(type_of(st->capturedPiece) != KING);
889
890   if (type_of(m) == PROMOTION)
891   {
892       assert(relative_rank(us, to) == RANK_8);
893       assert(type_of(pc) == promotion_type(m));
894       assert(type_of(pc) >= KNIGHT && type_of(pc) <= QUEEN);
895
896       remove_piece(pc, to);
897       pc = make_piece(us, PAWN);
898       put_piece(pc, to);
899   }
900
901   if (type_of(m) == CASTLING)
902   {
903       Square rfrom, rto;
904       do_castling<false>(us, from, to, rfrom, rto);
905   }
906   else
907   {
908       move_piece(pc, to, from); // Put the piece back at the source square
909
910       if (st->capturedPiece)
911       {
912           Square capsq = to;
913
914           if (type_of(m) == ENPASSANT)
915           {
916               capsq -= pawn_push(us);
917
918               assert(type_of(pc) == PAWN);
919               assert(to == st->previous->epSquare);
920               assert(relative_rank(us, to) == RANK_6);
921               assert(piece_on(capsq) == NO_PIECE);
922               assert(st->capturedPiece == make_piece(~us, PAWN));
923           }
924
925           put_piece(st->capturedPiece, capsq); // Restore the captured piece
926       }
927   }
928
929   // Finally point our state pointer back to the previous state
930   st = st->previous;
931   --gamePly;
932
933   assert(pos_is_ok());
934 }
935
936
937 /// Position::do_castling() is a helper used to do/undo a castling move. This
938 /// is a bit tricky in Chess960 where from/to squares can overlap.
939 template<bool Do>
940 void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto) {
941
942   bool kingSide = to > from;
943   rfrom = to; // Castling is encoded as "king captures friendly rook"
944   rto = relative_square(us, kingSide ? SQ_F1 : SQ_D1);
945   to = relative_square(us, kingSide ? SQ_G1 : SQ_C1);
946
947   // Remove both pieces first since squares could overlap in Chess960
948   remove_piece(make_piece(us, KING), Do ? from : to);
949   remove_piece(make_piece(us, ROOK), Do ? rfrom : rto);
950   board[Do ? from : to] = board[Do ? rfrom : rto] = NO_PIECE; // Since remove_piece doesn't do it for us
951   put_piece(make_piece(us, KING), Do ? to : from);
952   put_piece(make_piece(us, ROOK), Do ? rto : rfrom);
953 }
954
955
956 /// Position::do(undo)_null_move() is used to do(undo) a "null move": It flips
957 /// the side to move without executing any move on the board.
958
959 void Position::do_null_move(StateInfo& newSt) {
960
961   assert(!checkers());
962   assert(&newSt != st);
963
964   std::memcpy(&newSt, st, sizeof(StateInfo));
965   newSt.previous = st;
966   st = &newSt;
967
968   if (st->epSquare != SQ_NONE)
969   {
970       st->key ^= Zobrist::enpassant[file_of(st->epSquare)];
971       st->epSquare = SQ_NONE;
972   }
973
974   st->key ^= Zobrist::side;
975   prefetch(TT.first_entry(st->key));
976
977   ++st->rule50;
978   st->pliesFromNull = 0;
979
980   sideToMove = ~sideToMove;
981
982   set_check_info(st);
983
984   assert(pos_is_ok());
985 }
986
987 void Position::undo_null_move() {
988
989   assert(!checkers());
990
991   st = st->previous;
992   sideToMove = ~sideToMove;
993 }
994
995
996 /// Position::key_after() computes the new hash key after the given move. Needed
997 /// for speculative prefetch. It doesn't recognize special moves like castling,
998 /// en-passant and promotions.
999
1000 Key Position::key_after(Move m) const {
1001
1002   Square from = from_sq(m);
1003   Square to = to_sq(m);
1004   Piece pc = piece_on(from);
1005   Piece captured = piece_on(to);
1006   Key k = st->key ^ Zobrist::side;
1007
1008   if (captured)
1009       k ^= Zobrist::psq[captured][to];
1010
1011   return k ^ Zobrist::psq[pc][to] ^ Zobrist::psq[pc][from];
1012 }
1013
1014
1015 /// Position::see_ge (Static Exchange Evaluation Greater or Equal) tests if the
1016 /// SEE value of move is greater or equal to the given threshold. We'll use an
1017 /// algorithm similar to alpha-beta pruning with a null window.
1018
1019 bool Position::see_ge(Move m, Value threshold) const {
1020
1021   assert(is_ok(m));
1022
1023   // Only deal with normal moves, assume others pass a simple see
1024   if (type_of(m) != NORMAL)
1025       return VALUE_ZERO >= threshold;
1026
1027   Bitboard stmAttackers;
1028   Square from = from_sq(m), to = to_sq(m);
1029   PieceType nextVictim = type_of(piece_on(from));
1030   Color us = color_of(piece_on(from));
1031   Color stm = ~us; // First consider opponent's move
1032   Value balance;   // Values of the pieces taken by us minus opponent's ones
1033
1034   // The opponent may be able to recapture so this is the best result
1035   // we can hope for.
1036   balance = PieceValue[MG][piece_on(to)] - threshold;
1037
1038   if (balance < VALUE_ZERO)
1039       return false;
1040
1041   // Now assume the worst possible result: that the opponent can
1042   // capture our piece for free.
1043   balance -= PieceValue[MG][nextVictim];
1044
1045   // If it is enough (like in PxQ) then return immediately. Note that
1046   // in case nextVictim == KING we always return here, this is ok
1047   // if the given move is legal.
1048   if (balance >= VALUE_ZERO)
1049       return true;
1050
1051   // Find all attackers to the destination square, with the moving piece
1052   // removed, but possibly an X-ray attacker added behind it.
1053   Bitboard occupied = pieces() ^ from ^ to;
1054   Bitboard attackers = attackers_to(to, occupied) & occupied;
1055
1056   while (true)
1057   {
1058       stmAttackers = attackers & pieces(stm);
1059
1060       // Don't allow pinned pieces to attack (except the king) as long as
1061       // all pinners are on their original square.
1062       if (!(st->pinners[~stm] & ~occupied))
1063           stmAttackers &= ~st->blockersForKing[stm];
1064
1065       // If stm has no more attackers then give up: stm loses
1066       if (!stmAttackers)
1067           break;
1068
1069       // Locate and remove the next least valuable attacker, and add to
1070       // the bitboard 'attackers' the possibly X-ray attackers behind it.
1071       nextVictim = min_attacker<PAWN>(byTypeBB, to, stmAttackers, occupied, attackers);
1072
1073       stm = ~stm; // Switch side to move
1074
1075       // Negamax the balance with alpha = balance, beta = balance+1 and
1076       // add nextVictim's value.
1077       //
1078       //      (balance, balance+1) -> (-balance-1, -balance)
1079       //
1080       assert(balance < VALUE_ZERO);
1081
1082       balance = -balance - 1 - PieceValue[MG][nextVictim];
1083
1084       // If balance is still non-negative after giving away nextVictim then we
1085       // win. The only thing to be careful about it is that we should revert
1086       // stm if we captured with the king when the opponent still has attackers.
1087       if (balance >= VALUE_ZERO)
1088       {
1089           if (nextVictim == KING && (attackers & pieces(stm)))
1090               stm = ~stm;
1091           break;
1092       }
1093       assert(nextVictim != KING);
1094   }
1095   return us != stm; // We break the above loop when stm loses
1096 }
1097
1098
1099 /// Position::is_draw() tests whether the position is drawn by 50-move rule
1100 /// or by repetition. It does not detect stalemates.
1101
1102 bool Position::is_draw(int ply) const {
1103
1104   if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
1105       return true;
1106
1107   int end = std::min(st->rule50, st->pliesFromNull);
1108
1109   if (end < 4)
1110     return false;
1111
1112   StateInfo* stp = st->previous->previous;
1113   int cnt = 0;
1114
1115   for (int i = 4; i <= end; i += 2)
1116   {
1117       stp = stp->previous->previous;
1118
1119       // Return a draw score if a position repeats once earlier but strictly
1120       // after the root, or repeats twice before or at the root.
1121       if (   stp->key == st->key
1122           && ++cnt + (ply > i) == 2)
1123           return true;
1124   }
1125
1126   return false;
1127 }
1128
1129
1130 // Position::has_repeated() tests whether there has been at least one repetition
1131 // of positions since the last capture or pawn move.
1132
1133 bool Position::has_repeated() const {
1134
1135     StateInfo* stc = st;
1136     while (true)
1137     {
1138         int i = 4, end = std::min(stc->rule50, stc->pliesFromNull);
1139
1140         if (end < i)
1141             return false;
1142
1143         StateInfo* stp = stc->previous->previous;
1144
1145         do {
1146             stp = stp->previous->previous;
1147
1148             if (stp->key == stc->key)
1149                 return true;
1150
1151             i += 2;
1152         } while (i <= end);
1153
1154         stc = stc->previous;
1155     }
1156 }
1157
1158
1159 /// Position::has_game_cycle() tests if the position has a move which draws by repetition,
1160 /// or an earlier position has a move that directly reaches the current position.
1161
1162 bool Position::has_game_cycle(int ply) const {
1163
1164   int j;
1165
1166   int end = std::min(st->rule50, st->pliesFromNull);
1167
1168   if (end < 3)
1169     return false;
1170
1171   Key originalKey = st->key;
1172   StateInfo* stp = st->previous;
1173
1174   for (int i = 3; i <= end; i += 2)
1175   {
1176       stp = stp->previous->previous;
1177
1178       Key moveKey = originalKey ^ stp->key;
1179       if (   (j = H1(moveKey), cuckoo[j] == moveKey)
1180           || (j = H2(moveKey), cuckoo[j] == moveKey))
1181       {
1182           Move move = cuckooMove[j];
1183           Square s1 = from_sq(move);
1184           Square s2 = to_sq(move);
1185
1186           if (!(between_bb(s1, s2) & pieces()))
1187           {
1188               // In the cuckoo table, both moves Rc1c5 and Rc5c1 are stored in the same
1189               // location. We select the legal one by reversing the move variable if necessary.
1190               if (empty(s1))
1191                   move = make_move(s2, s1);
1192
1193               if (ply > i)
1194                   return true;
1195
1196               // For repetitions before or at the root, require one more
1197               StateInfo* next_stp = stp;
1198               for (int k = i + 2; k <= end; k += 2)
1199               {
1200                   next_stp = next_stp->previous->previous;
1201                   if (next_stp->key == stp->key)
1202                      return true;
1203               }
1204           }
1205       }
1206   }
1207   return false;
1208 }
1209
1210
1211 /// Position::flip() flips position with the white and black sides reversed. This
1212 /// is only useful for debugging e.g. for finding evaluation symmetry bugs.
1213
1214 void Position::flip() {
1215
1216   string f, token;
1217   std::stringstream ss(fen());
1218
1219   for (Rank r = RANK_8; r >= RANK_1; --r) // Piece placement
1220   {
1221       std::getline(ss, token, r > RANK_1 ? '/' : ' ');
1222       f.insert(0, token + (f.empty() ? " " : "/"));
1223   }
1224
1225   ss >> token; // Active color
1226   f += (token == "w" ? "B " : "W "); // Will be lowercased later
1227
1228   ss >> token; // Castling availability
1229   f += token + " ";
1230
1231   std::transform(f.begin(), f.end(), f.begin(),
1232                  [](char c) { return char(islower(c) ? toupper(c) : tolower(c)); });
1233
1234   ss >> token; // En passant square
1235   f += (token == "-" ? token : token.replace(1, 1, token[1] == '3' ? "6" : "3"));
1236
1237   std::getline(ss, token); // Half and full moves
1238   f += token;
1239
1240   set(f, is_chess960(), st, this_thread());
1241
1242   assert(pos_is_ok());
1243 }
1244
1245
1246 /// Position::pos_is_ok() performs some consistency checks for the
1247 /// position object and raises an asserts if something wrong is detected.
1248 /// This is meant to be helpful when debugging.
1249
1250 bool Position::pos_is_ok() const {
1251
1252   constexpr bool Fast = true; // Quick (default) or full check?
1253
1254   if (   (sideToMove != WHITE && sideToMove != BLACK)
1255       || piece_on(square<KING>(WHITE)) != W_KING
1256       || piece_on(square<KING>(BLACK)) != B_KING
1257       || (   ep_square() != SQ_NONE
1258           && relative_rank(sideToMove, ep_square()) != RANK_6))
1259       assert(0 && "pos_is_ok: Default");
1260
1261   if (Fast)
1262       return true;
1263
1264   if (   pieceCount[W_KING] != 1
1265       || pieceCount[B_KING] != 1
1266       || attackers_to(square<KING>(~sideToMove)) & pieces(sideToMove))
1267       assert(0 && "pos_is_ok: Kings");
1268
1269   if (   (pieces(PAWN) & (Rank1BB | Rank8BB))
1270       || pieceCount[W_PAWN] > 8
1271       || pieceCount[B_PAWN] > 8)
1272       assert(0 && "pos_is_ok: Pawns");
1273
1274   if (   (pieces(WHITE) & pieces(BLACK))
1275       || (pieces(WHITE) | pieces(BLACK)) != pieces()
1276       || popcount(pieces(WHITE)) > 16
1277       || popcount(pieces(BLACK)) > 16)
1278       assert(0 && "pos_is_ok: Bitboards");
1279
1280   for (PieceType p1 = PAWN; p1 <= KING; ++p1)
1281       for (PieceType p2 = PAWN; p2 <= KING; ++p2)
1282           if (p1 != p2 && (pieces(p1) & pieces(p2)))
1283               assert(0 && "pos_is_ok: Bitboards");
1284
1285   StateInfo si = *st;
1286   set_state(&si);
1287   if (std::memcmp(&si, st, sizeof(StateInfo)))
1288       assert(0 && "pos_is_ok: State");
1289
1290   for (Piece pc : Pieces)
1291   {
1292       if (   pieceCount[pc] != popcount(pieces(color_of(pc), type_of(pc)))
1293           || pieceCount[pc] != std::count(board, board + SQUARE_NB, pc))
1294           assert(0 && "pos_is_ok: Pieces");
1295
1296       for (int i = 0; i < pieceCount[pc]; ++i)
1297           if (board[pieceList[pc][i]] != pc || index[pieceList[pc][i]] != i)
1298               assert(0 && "pos_is_ok: Index");
1299   }
1300
1301   for (Color c = WHITE; c <= BLACK; ++c)
1302       for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s + 1))
1303       {
1304           if (!can_castle(c | s))
1305               continue;
1306
1307           if (   piece_on(castlingRookSquare[c | s]) != make_piece(c, ROOK)
1308               || castlingRightsMask[castlingRookSquare[c | s]] != (c | s)
1309               || (castlingRightsMask[square<KING>(c)] & (c | s)) != (c | s))
1310               assert(0 && "pos_is_ok: Castling");
1311       }
1312
1313   return true;
1314 }