public void set(int flags) { if (!ignoreFlags) { if (isReversed) flags = EngUtil.reverseFlags(flags); // castling privileges if (!EngUtil.canCastle(flags, WHITE_KINGS_CASTLING)) theValue ^= castle_random_w[0]; if (!EngUtil.canCastle(flags, WHITE_QUEENS_CASTLING)) theValue ^= castle_random_w[1]; if (!EngUtil.canCastle(flags, BLACK_KINGS_CASTLING)) theValue ^= castle_random_b[0]; if (!EngUtil.canCastle(flags, BLACK_QUEENS_CASTLING)) theValue ^= castle_random_b[1]; boolean whiteToMove = (flags & WHITE) != 0; // en-passant target square int epFile = EngUtil.enPassantFile(flags); if (epFile != 0) { int epSquare; if (whiteToMove) epSquare = EngUtil.square(epFile, ROW_6); else epSquare = EngUtil.square(epFile, ROW_3); theValue ^= enpassant_random[square64(epSquare)]; } // color to move if (EngUtil.allOf(flags, WHITE)) theValue ^= wtm_random[0]; else if (EngUtil.allOf(flags, BLACK)) theValue ^= wtm_random[1]; else /* this branch is used when computing hash keys for look up in the crafty book. there is no turn color. */ ; } }
public void set(int square, int piece) { /* translate jose square encoding (0..80) to crafty square encoding (A1=0, B1=1, .. H8=63) */ if (isReversed) { square = EngUtil.mirrorSquare(square); piece = EngUtil.oppositeColor(piece); } square = square64(square); switch (piece) { case WHITE_PAWN: theValue ^= w_pawn_random[square]; break; case BLACK_PAWN: theValue ^= b_pawn_random[square]; break; case WHITE_KNIGHT: theValue ^= w_knight_random[square]; break; case BLACK_KNIGHT: theValue ^= b_knight_random[square]; break; case WHITE_BISHOP: theValue ^= w_bishop_random[square]; break; case BLACK_BISHOP: theValue ^= b_bishop_random[square]; break; case WHITE_ROOK: theValue ^= w_rook_random[square]; break; case BLACK_ROOK: theValue ^= b_rook_random[square]; break; case WHITE_QUEEN: theValue ^= w_queen_random[square]; break; case BLACK_QUEEN: theValue ^= b_queen_random[square]; break; case WHITE_KING: theValue ^= w_king_random[square]; break; case BLACK_KING: theValue ^= b_king_random[square]; break; default: throw new IllegalArgumentException(); } }
/* translate jose square encoding (0..80) to crafty square encoding (A1=0, B1=1, .. H8=63) */ private static int square64(int jose_square) { int file0 = EngUtil.fileOf(jose_square) - FILE_A; int row0 = EngUtil.rowOf(jose_square) - ROW_1; return 8 * row0 + file0; }