#include <sstream>
#include "bitcount.h"
-#include "mersenne.h"
#include "movegen.h"
#include "movepick.h"
#include "position.h"
#include "psqtab.h"
+#include "rkiss.h"
#include "san.h"
#include "tt.h"
#include "ucioption.h"
/// or the FEN string, we want the new born Position object do not depend
/// on any external data so we detach state pointer from the source one.
-Position::Position(int th) : threadID(th) {}
-
Position::Position(const Position& pos, int th) {
memcpy(this, &pos, sizeof(Position));
detach(); // Always detach() in copy c'tor to avoid surprises
threadID = th;
+ nodes = 0;
}
Position::Position(const string& fen, int th) {
assert(is_ok());
assert(move_is_ok(m));
+ nodes++;
Key key = st->key;
// Copy some fields of old state to our new StateInfo object except the
Value npMaterial[2];
};
- memcpy(&newSt, st, sizeof(ReducedStateInfo));
+ if (&newSt != st)
+ memcpy(&newSt, st, sizeof(ReducedStateInfo));
+
newSt.previous = st;
st = &newSt;
memset(st, 0, sizeof(StateInfo));
st->epSquare = SQ_NONE;
startPosPlyCounter = 0;
+ nodes = 0;
memset(byColorBB, 0, sizeof(Bitboard) * 2);
memset(byTypeBB, 0, sizeof(Bitboard) * 8);
void Position::init_zobrist() {
+ RKISS RKiss;
int i,j, k;
for (i = 0; i < 2; i++) for (j = 0; j < 8; j++) for (k = 0; k < 64; k++)
- zobrist[i][j][k] = Key(genrand_int64());
+ zobrist[i][j][k] = RKiss.rand<Key>();
for (i = 0; i < 64; i++)
- zobEp[i] = Key(genrand_int64());
+ zobEp[i] = RKiss.rand<Key>();
for (i = 0; i < 16; i++)
- zobCastle[i] = Key(genrand_int64());
+ zobCastle[i] = RKiss.rand<Key>();
- zobSideToMove = Key(genrand_int64());
- zobExclusion = Key(genrand_int64());
+ zobSideToMove = RKiss.rand<Key>();
+ zobExclusion = RKiss.rand<Key>();
}