RookValueEndgame, QueenValueEndgame
};
-
-namespace {
-
- // Bonus for having the side to move (modified by Joona Kiiski)
- const Score Tempo = make_score(48, 22);
-
- // To convert a Piece to and from a FEN char
- const string PieceToChar(" PNBRQK pnbrqk .");
-}
+// To convert a Piece to and from a FEN char
+static const string PieceToChar(" PNBRQK pnbrqk .");
/// CheckInfo c'tor
Square kfrom = king_square(c);
CastlingSide cs = kfrom < rfrom ? KING_SIDE : QUEEN_SIDE;
- int cr = (cs == KING_SIDE ? WHITE_OO : WHITE_OOO) << c;
+ CastleRight cr = make_castle_right(c, cs);
st->castleRights |= cr;
castleRightsMask[kfrom] |= cr;
prefetch((char*)TT.first_entry(k));
// Move the piece
- Bitboard from_to_bb = SquareBB[from] | SquareBB[to];
+ Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to];
byTypeBB[ALL_PIECES] ^= from_to_bb;
byTypeBB[pt] ^= from_to_bb;
byColorBB[us] ^= from_to_bb;
}
}
- // Finish
sideToMove = ~sideToMove;
- st->psqScore += (sideToMove == WHITE ? Tempo : -Tempo);
assert(pos_is_ok());
}
}
// Put the piece back at the source square
- Bitboard from_to_bb = SquareBB[from] | SquareBB[to];
+ Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to];
byTypeBB[ALL_PIECES] ^= from_to_bb;
byTypeBB[pt] ^= from_to_bb;
byColorBB[us] ^= from_to_bb;
assert(piece_on(kfrom) == make_piece(us, KING));
assert(piece_on(rfrom) == make_piece(us, ROOK));
- // Remove pieces from source squares
- byTypeBB[ALL_PIECES] ^= kfrom;
- byTypeBB[KING] ^= kfrom;
- byColorBB[us] ^= kfrom;
- byTypeBB[ALL_PIECES] ^= rfrom;
- byTypeBB[ROOK] ^= rfrom;
- byColorBB[us] ^= rfrom;
-
- // Put pieces on destination squares
- byTypeBB[ALL_PIECES] |= kto;
- byTypeBB[KING] |= kto;
- byColorBB[us] |= kto;
- byTypeBB[ALL_PIECES] |= rto;
- byTypeBB[ROOK] |= rto;
- byColorBB[us] |= rto;
+ // Move the pieces, with some care; in chess960 could be kto == rfrom
+ Bitboard k_from_to_bb = SquareBB[kfrom] ^ SquareBB[kto];
+ Bitboard r_from_to_bb = SquareBB[rfrom] ^ SquareBB[rto];
+ byTypeBB[KING] ^= k_from_to_bb;
+ byTypeBB[ROOK] ^= r_from_to_bb;
+ byTypeBB[ALL_PIECES] ^= k_from_to_bb ^ r_from_to_bb;
+ byColorBB[us] ^= k_from_to_bb ^ r_from_to_bb;
// Update board
Piece king = make_piece(us, KING);
// Update checkers BB
st->checkersBB = attackers_to(king_square(~us)) & pieces(us);
- // Finish
sideToMove = ~sideToMove;
- st->psqScore += (sideToMove == WHITE ? Tempo : -Tempo);
}
else
// Undo: point our state pointer back to the previous state
st->epSquare = SQ_NONE;
st->rule50++;
st->pliesFromNull = 0;
- st->psqScore += (sideToMove == WHITE ? Tempo : -Tempo);
}
assert(pos_is_ok());
/// updated by do_move and undo_move when the program is running in debug mode.
Score Position::compute_psq_score() const {
- Bitboard b;
Score result = SCORE_ZERO;
+ Bitboard b = pieces();
- for (Color c = WHITE; c <= BLACK; c++)
- for (PieceType pt = PAWN; pt <= KING; pt++)
- {
- b = pieces(pt, c);
- while (b)
- result += pieceSquareTable[make_piece(c, pt)][pop_1st_bit(&b)];
- }
+ while (b)
+ {
+ Square s = pop_1st_bit(&b);
+ result += pieceSquareTable[piece_on(s)][s];
+ }
- result += (sideToMove == WHITE ? Tempo / 2 : -Tempo / 2);
return result;
}
if (failedStep) (*failedStep)++;
if (debugCastleSquares)
for (Color c = WHITE; c <= BLACK; c++)
- for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s+1))
+ for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s + 1))
{
- CastleRight cr = CastleRight((s == KING_SIDE ? WHITE_OO : WHITE_OOO) << c);
-
- if (!can_castle(cr))
+ if (!can_castle(make_castle_right(c, s)))
continue;
if ( piece_on(castleRookSquare[c][s]) != make_piece(c, ROOK)
- || castleRightsMask[castleRookSquare[c][s]] != cr)
+ || castleRightsMask[castleRookSquare[c][s]] != make_castle_right(c, s))
return false;
}