i++;
// En passant square
- if ( i < fen.length() - 2
+ if ( i <= fen.length() - 2
&& (fen[i] >= 'a' && fen[i] <= 'h')
&& (fen[i+1] == '3' || fen[i+1] == '6'))
st->epSquare = square_from_string(fen.substr(i, 2));
st->capture = type_of_piece_on(to);
if (st->capture)
- do_capture_move(m, st->capture, them, to);
+ do_capture_move(st->capture, them, to);
// Move the piece
clear_bit(&(byColorBB[us]), from);
/// Position::do_capture_move() is a private method used to update captured
/// piece info. It is called from the main Position::do_move function.
-void Position::do_capture_move(Move m, PieceType capture, Color them, Square to) {
+void Position::do_capture_move(PieceType capture, Color them, Square to) {
assert(capture != KING);
st->mgValue -= pst<MidGame>(them, capture, to);
st->egValue -= pst<EndGame>(them, capture, to);
- assert(!move_promotion(m) || capture != PAWN);
-
// Update material
if (capture != PAWN)
npMaterial[them] -= piece_value_midgame(capture);
st->capture = type_of_piece_on(to);
if (st->capture)
- do_capture_move(m, st->capture, them, to);
+ do_capture_move(st->capture, them, to);
// Remove pawn
clear_bit(&(byColorBB[us]), from);
// Remove the attacker we just found from the 'attackers' bitboard,
// and scan for new X-ray attacks behind the attacker.
b = attackers & pieces_of_color_and_type(c, pt);
- occ ^= (b & -b);
+ occ ^= (b & (~b + 1));
attackers |= (rook_attacks_bb(to, occ) & rooks_and_queens())
| (bishop_attacks_bb(to, occ) & bishops_and_queens());
void Position::init_zobrist() {
- for (int i = 0; i < 2; i++)
- for (int j = 0; j < 8; j++)
- for (int k = 0; k < 64; k++)
- zobrist[i][j][k] = Key(genrand_int64());
+ for(Piece p = WP; p <= BK; p++)
+ for(Square s = SQ_A1; s <= SQ_H8; s++)
+ zobrist[color_of_piece(p)][type_of_piece(p)][s] = genrand_int64();
- for (int i = 0; i < 64; i++)
- zobEp[i] = Key(genrand_int64());
+ zobEp[0] = 0ULL;
+ for(int i = 1; i < 64; i++)
+ zobEp[i] = genrand_int64();
- for (int i = 0; i < 16; i++)
- zobCastle[i] = genrand_int64();
+ for(int i = 15; i >= 0; i--)
+ zobCastle[(i&8) | (i&1) | ((i&2) << 1) | ((i&4) >> 1)] = genrand_int64();
zobSideToMove = genrand_int64();
for (int i = 0; i < 2; i++)
for (int j = 0; j < 8; j++)
for (int k = 0; k < 16; k++)
- zobMaterial[i][j][k] = (k > 0)? Key(genrand_int64()) : Key(0LL);
+ zobMaterial[i][j][k] = (k > 0)? genrand_int64() : 0LL;
for (int i = 0; i < 16; i++)
- zobMaterial[0][KING][i] = zobMaterial[1][KING][i] = Key(0ULL);
+ zobMaterial[0][KING][i] = zobMaterial[1][KING][i] = 0ULL;
}