/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
- Copyright (C) 2008-2014 Marco Costalba, Joona Kiiski, Tord Romstad
+ Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <algorithm>
#include <cassert>
-#include <cstring>
+#include <cstring> // For std::memset
#include <iomanip>
#include <sstream>
#include "bitcount.h"
+#include "misc.h"
#include "movegen.h"
#include "position.h"
#include "psqtab.h"
-#include "rkiss.h"
#include "thread.h"
#include "tt.h"
#include "uci.h"
<< std::setfill('0') << std::setw(16) << pos.st->key << std::dec << "\nCheckers: ";
for (Bitboard b = pos.checkers(); b; )
- os << UCI::format_square(pop_lsb(&b)) << " ";
+ os << UCI::square(pop_lsb(&b)) << " ";
return os;
}
void Position::init() {
- RKISS rk;
+ PRNG rng(1070372);
for (Color c = WHITE; c <= BLACK; ++c)
for (PieceType pt = PAWN; pt <= KING; ++pt)
for (Square s = SQ_A1; s <= SQ_H8; ++s)
- Zobrist::psq[c][pt][s] = rk.rand<Key>();
+ Zobrist::psq[c][pt][s] = rng.rand<Key>();
for (File f = FILE_A; f <= FILE_H; ++f)
- Zobrist::enpassant[f] = rk.rand<Key>();
+ Zobrist::enpassant[f] = rng.rand<Key>();
for (int cr = NO_CASTLING; cr <= ANY_CASTLING; ++cr)
{
while (b)
{
Key k = Zobrist::castling[1ULL << pop_lsb(&b)];
- Zobrist::castling[cr] ^= k ? k : rk.rand<Key>();
+ Zobrist::castling[cr] ^= k ? k : rng.rand<Key>();
}
}
- Zobrist::side = rk.rand<Key>();
- Zobrist::exclusion = rk.rand<Key>();
+ Zobrist::side = rng.rand<Key>();
+ Zobrist::exclusion = rng.rand<Key>();
for (PieceType pt = PAWN; pt <= KING; ++pt)
{
}
-/// Position::operator=() creates a copy of 'pos'. We want the new born Position
-/// object to not depend on any external data so we detach state pointer from
-/// the source one.
+/// Position::operator=() creates a copy of 'pos' but detaching the state pointer
+/// from the source to be self-consistent and not depending on any external data.
Position& Position::operator=(const Position& pos) {
if (!can_castle(WHITE) && !can_castle(BLACK))
ss << '-';
- ss << (ep_square() == SQ_NONE ? " - " : " " + UCI::format_square(ep_square()) + " ")
+ ss << (ep_square() == SQ_NONE ? " - " : " " + UCI::square(ep_square()) + " ")
<< st->rule50 << " " << 1 + (gamePly - (sideToMove == BLACK)) / 2;
return ss.str();
return true;
// Is there a discovered check?
- if ( unlikely(ci.dcCandidates)
+ if ( ci.dcCandidates
&& (ci.dcCandidates & from)
&& !aligned(from, to, ci.ksq))
return true;
st->checkersBB |= to;
// Discovered checks
- if (unlikely(ci.dcCandidates) && (ci.dcCandidates & from))
+ if (ci.dcCandidates && (ci.dcCandidates & from))
{
if (pt != ROOK)
st->checkersBB |= attacks_from<ROOK>(king_square(them)) & pieces(us, QUEEN, ROOK);