set_bit(&(byTypeBB[promotion]), to);
board[to] = piece_of_color_and_type(us, promotion);
+ // Update material key
+ st->materialKey ^= zobMaterial[us][PAWN][pieceCount[us][PAWN]];
+ st->materialKey ^= zobMaterial[us][promotion][pieceCount[us][promotion]+1];
+
// Update piece counts
pieceCount[us][PAWN]--;
pieceCount[us][promotion]++;
key ^= zobrist[us][PAWN][to] ^ zobrist[us][promotion][to];
st->pawnKey ^= zobrist[us][PAWN][to];
- // Update material key
- st->materialKey ^= zobMaterial[us][PAWN][pieceCount[us][PAWN]];
- st->materialKey ^= zobMaterial[us][promotion][pieceCount[us][promotion]+1];
-
// Partially revert and update incremental scores
st->mgValue -= pst<MidGame>(us, PAWN, to);
st->mgValue += pst<MidGame>(us, promotion, to);
st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame;
st->egValue += (sideToMove == WHITE)? TempoValueEndgame : -TempoValueEndgame;
+
+ assert(is_ok());
}
void Position::do_castle_move(Move m) {
- assert(is_ok());
assert(move_is_ok(m));
assert(move_is_castle(m));
st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame;
st->egValue += (sideToMove == WHITE)? TempoValueEndgame : -TempoValueEndgame;
+
+ assert(is_ok());
}
// Finally point our state pointer back to the previous state
st = st->previous;
+
+ assert(is_ok());
}
// Finally point our state pointer back to the previous state
st = st->previous;
+
+ assert(is_ok());
}
memset(st, 0, sizeof(StateInfo));
st->epSquare = SQ_NONE;
- memset(index, 0, sizeof(int) * 64);
- memset(byColorBB, 0, sizeof(Bitboard) * 2);
+ memset(byColorBB, 0, sizeof(Bitboard) * 2);
+ memset(byTypeBB, 0, sizeof(Bitboard) * 8);
+ memset(pieceCount, 0, sizeof(int) * 2 * 8);
+ memset(index, 0, sizeof(int) * 64);
for (int i = 0; i < 64; i++)
board[i] = EMPTY;
for (int i = 0; i < 7; i++)
- {
- byTypeBB[i] = EmptyBoardBB;
- pieceCount[0][i] = pieceCount[1][i] = 0;
for (int j = 0; j < 8; j++)
pieceList[0][i][j] = pieceList[1][i][j] = SQ_NONE;
- }
sideToMove = WHITE;
gamePly = 0;