void Position::do_move(Move m, StateInfo& newSt) {
CheckInfo ci(*this);
- do_move(m, newSt, ci, gives_check(m, ci));
+ do_move(m, newSt, gives_check(m, ci));
}
-void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveIsCheck) {
+void Position::do_move(Move m, StateInfo& newSt, bool moveIsCheck) {
assert(is_ok(m));
assert(&newSt != st);
// Update the key with the final value
st->key = k;
- // Update checkers bitboard: piece must be already moved due to attacks_from()
- st->checkersBB = 0;
-
- if (moveIsCheck)
- {
- if (type_of(m) != NORMAL)
- st->checkersBB = attackers_to(king_square(them)) & pieces(us);
- else
- {
- // Direct checks
- if (ci.checkSq[pt] & to)
- st->checkersBB |= to;
-
- // Discovered checks
- if (ci.dcCandidates && (ci.dcCandidates & from))
- {
- if (pt != ROOK)
- st->checkersBB |= attacks_from<ROOK>(king_square(them)) & pieces(us, QUEEN, ROOK);
-
- if (pt != BISHOP)
- st->checkersBB |= attacks_from<BISHOP>(king_square(them)) & pieces(us, QUEEN, BISHOP);
- }
- }
- }
+ // Calculate checkers bitboard (if move is check)
+ st->checkersBB = moveIsCheck ? attackers_to(king_square(them)) & pieces(us) : 0;
sideToMove = ~sideToMove;
/// Position::flip() flips position with the white and black sides reversed. This
/// is only useful for debugging e.g. for finding evaluation symmetry bugs.
+static char toggle_case(char c) {
+ return char(islower(c) ? toupper(c) : tolower(c));
+}
+
void Position::flip() {
string f, token;
ss >> token; // Castling availability
f += token + " ";
- std::transform(f.begin(), f.end(), f.begin(),
- [](char c) { return char(islower(c) ? toupper(c) : tolower(c)); });
+ std::transform(f.begin(), f.end(), f.begin(), toggle_case);
ss >> token; // En passant square
f += (token == "-" ? token : token.replace(1, 1, token[1] == '3' ? "6" : "3"));