operator[]('B') = WB; operator[]('b') = BB;
operator[]('N') = WN; operator[]('n') = BN;
operator[]('P') = WP; operator[]('p') = BP;
- operator[](' ') = PIECE_NONE; operator[]('.') = PIECE_NONE_DARK_SQ;
+ operator[](' ') = PIECE_NONE;
+ operator[]('.') = PIECE_NONE_DARK_SQ;
}
char from_piece(Piece p) const {
- std::map<char, Piece>::const_iterator it;
- for (it = begin(); it != end(); ++it)
- if (it->second == p)
- return it->first;
+ std::map<char, Piece>::const_iterator it;
+ for (it = begin(); it != end(); ++it)
+ if (it->second == p)
+ return it->first;
- assert(false);
- return 0;
+ assert(false);
+ return 0;
}
- } pieceLetters;
+ };
+
+ PieceLetters pieceLetters;
}
nodes = 0;
}
-Position::Position(const string& fen, int th) {
+Position::Position(const string& fen, bool isChess960, int th) {
- from_fen(fen);
+ from_fen(fen, isChess960);
threadID = th;
}
/// string. This function is not very robust - make sure that input FENs are
/// correct (this is assumed to be the responsibility of the GUI).
-void Position::from_fen(const string& fen) {
+void Position::from_fen(const string& fen, bool c960) {
/*
A FEN string defines a particular position using only the ASCII character set.
castleRightsMask[make_square(initialQRFile, RANK_1)] ^= WHITE_OOO;
castleRightsMask[make_square(initialQRFile, RANK_8)] ^= BLACK_OOO;
- isChess960 = initialKFile != FILE_E
- || initialQRFile != FILE_A
- || initialKRFile != FILE_H;
-
+ isChess960 = c960;
find_checkers();
st->key = compute_key();
switch (p)
{
- case WP: return attacks_from<PAWN>(s, WHITE);
- case BP: return attacks_from<PAWN>(s, BLACK);
- case WN: case BN: return attacks_from<KNIGHT>(s);
case WB: case BB: return attacks_from<BISHOP>(s);
case WR: case BR: return attacks_from<ROOK>(s);
case WQ: case BQ: return attacks_from<QUEEN>(s);
- case WK: case BK: return attacks_from<KING>(s);
- default: break;
+ default: return NonSlidingAttacksBB[p][s];
+ }
+}
+
+Bitboard Position::attacks_from(Piece p, Square s, Bitboard occ) {
+
+ assert(square_is_ok(s));
+
+ switch (p)
+ {
+ case WB: case BB: return bishop_attacks_bb(s, occ);
+ case WR: case BR: return rook_attacks_bb(s, occ);
+ case WQ: case BQ: return bishop_attacks_bb(s, occ) | rook_attacks_bb(s, occ);
+ default: return NonSlidingAttacksBB[p][s];
}
- return false;
}
// A non-king move is legal if and only if it is not pinned or it
// is moving along the ray towards or away from the king.
- return ( !pinned
- || !bit_is_set(pinned, from)
- || (direction_between_squares(from, king_square(us)) == direction_between_squares(move_to(m), king_square(us))));
+ return !pinned
+ || !bit_is_set(pinned, from)
+ || squares_aligned(from, move_to(m), king_square(us));
}
{
// For pawn and king moves we need to verify also direction
if ( (pt != PAWN && pt != KING)
- ||(direction_between_squares(from, ci.ksq) != direction_between_squares(to, ci.ksq)))
+ || !squares_aligned(from, to, ci.ksq))
return true;
}