Position& operator=(const Position&) = delete;
// FEN string input/output
- Position& set(const std::string& fenStr, bool isChess960, StateInfo* si, Thread* th);
+ Position& set(const Variant* v, const std::string& fenStr, bool isChess960, StateInfo* si, Thread* th, bool sfen = false);
Position& set(const std::string& code, Color c, StateInfo* si);
- const std::string fen() const;
+ const std::string fen(bool sfen = false, bool showPromoted = false, int countStarted = 0, std::string holdings = "-") const;
+
+ // Variant rule properties
+ const Variant* variant() const;
+ Rank max_rank() const;
+ File max_file() const;
+ bool two_boards() const;
+ Bitboard board_bb() const;
+ Bitboard board_bb(Color c, PieceType pt) const;
+ const std::set<PieceType>& piece_types() const;
+ const std::string& piece_to_char() const;
+ const std::string& piece_to_char_synonyms() const;
+ Rank promotion_rank() const;
+ const std::set<PieceType, std::greater<PieceType> >& promotion_piece_types() const;
+ bool sittuyin_promotion() const;
+ int promotion_limit(PieceType pt) const;
+ PieceType promoted_piece_type(PieceType pt) const;
+ bool piece_promotion_on_capture() const;
+ bool mandatory_pawn_promotion() const;
+ bool mandatory_piece_promotion() const;
+ bool piece_demotion() const;
+ bool endgame_eval() const;
+ bool double_step_enabled() const;
+ Rank double_step_rank() const;
+ bool first_rank_double_steps() const;
+ bool castling_enabled() const;
+ bool castling_dropped_piece() const;
+ File castling_kingside_file() const;
+ File castling_queenside_file() const;
+ Rank castling_rank(Color c) const;
+ PieceType castling_rook_piece() const;
+ PieceType king_type() const;
+ bool checking_permitted() const;
+ bool drop_checks() const;
+ bool must_capture() const;
+ bool must_drop() const;
+ bool piece_drops() const;
+ bool drop_loop() const;
+ bool captures_to_hand() const;
+ bool first_rank_pawn_drops() const;
+ bool drop_on_top() const;
+ EnclosingRule enclosing_drop() const;
+ Bitboard drop_region(Color c) const;
+ Bitboard drop_region(Color c, PieceType pt) const;
+ bool sittuyin_rook_drop() const;
+ bool drop_opposite_colored_bishop() const;
+ bool drop_promoted() const;
+ bool shogi_doubled_pawn() const;
+ bool immobility_illegal() const;
+ bool gating() const;
+ bool seirawan_gating() const;
+ bool cambodian_moves() const;
+ Bitboard diagonal_lines() const;
+ bool pass() const;
+ bool pass_on_stalemate() const;
+ Bitboard promoted_soldiers(Color c) const;
+ bool makpong() const;
+ EnclosingRule flip_enclosed_pieces() const;
+ // winning conditions
+ int n_move_rule() const;
+ int n_fold_rule() const;
+ Value stalemate_value(int ply = 0) const;
+ Value checkmate_value(int ply = 0) const;
+ Value extinction_value(int ply = 0) const;
+ bool extinction_claim() const;
+ const std::set<PieceType>& extinction_piece_types() const;
+ int extinction_piece_count() const;
+ int extinction_opponent_piece_count() const;
+ PieceType capture_the_flag_piece() const;
+ Bitboard capture_the_flag(Color c) const;
+ bool flag_move() const;
+ bool check_counting() const;
+ int connect_n() const;
+ CheckCount checks_remaining(Color c) const;
+ MaterialCounting material_counting() const;
+ CountingRule counting_rule() const;
+
+ // Variant-specific properties
+ int count_in_hand(Color c, PieceType pt) const;
+ int count_with_hand(Color c, PieceType pt) const;
+ bool bikjang() const;
// Position representation
- Bitboard pieces() const;
-- Bitboard pieces(PieceType pt) const;
++ Bitboard pieces(PieceType pt = ALL_PIECES) const;
Bitboard pieces(PieceType pt1, PieceType pt2) const;
Bitboard pieces(Color c) const;
Bitboard pieces(Color c, PieceType pt) const;
return board[s];
}
+ inline bool Position::empty(Square s) const {
+ return piece_on(s) == NO_PIECE;
+ }
+
+inline Piece Position::unpromoted_piece_on(Square s) const {
+ return unpromotedBoard[s];
+}
+
inline Piece Position::moved_piece(Move m) const {
+ if (type_of(m) == DROP)
+ return make_piece(sideToMove, dropped_piece_type(m));
- return board[from_sq(m)];
- }
-
- inline Bitboard Position::pieces() const {
- return byTypeBB[ALL_PIECES];
+ return piece_on(from_sq(m));
}
-inline Bitboard Position::pieces(PieceType pt = ALL_PIECES) const {
+inline Bitboard Position::pieces(PieceType pt) const {
return byTypeBB[pt];
}
}
inline Bitboard Position::pieces(Color c, PieceType pt1, PieceType pt2) const {
- return byColorBB[c] & (byTypeBB[pt1] | byTypeBB[pt2]);
+ return pieces(c) & (pieces(pt1) | pieces(pt2));
}
+inline Bitboard Position::major_pieces(Color c) const {
- return byColorBB[c] & (byTypeBB[QUEEN] | byTypeBB[AIWOK] | byTypeBB[ARCHBISHOP] | byTypeBB[CHANCELLOR] | byTypeBB[AMAZON]);
++ return pieces(c) & (pieces(QUEEN) | pieces(AIWOK) | pieces(ARCHBISHOP) | pieces(CHANCELLOR) | pieces(AMAZON));
+}
+
+inline int Position::count(Color c, PieceType pt) const {
+ return pieceCount[make_piece(c, pt)];
+}
+
template<PieceType Pt> inline int Position::count(Color c) const {
return pieceCount[make_piece(c, Pt)];
}
return pieceList[make_piece(c, Pt)];
}
+inline const Square* Position::squares(Color c, PieceType pt) const {
+ return pieceList[make_piece(c, pt)];
+}
+
template<PieceType Pt> inline Square Position::square(Color c) const {
assert(pieceCount[make_piece(c, Pt)] == 1);
- return pieceList[make_piece(c, Pt)][0];
+ return squares<Pt>(c)[0];
}
inline Square Position::ep_square() const {
}
inline Bitboard Position::attackers_to(Square s) const {
- return attackers_to(s, byTypeBB[ALL_PIECES]);
+ return attackers_to(s, pieces());
}
+inline Bitboard Position::attackers_to(Square s, Color c) const {
+ return attackers_to(s, byTypeBB[ALL_PIECES], c);
+}
+
+inline Bitboard Position::attackers_to(Square s, Bitboard occupied, Color c) const {
+ return attackers_to(s, occupied, c, byTypeBB[JANGGI_CANNON]);
+}
+
inline Bitboard Position::checkers() const {
return st->checkersBB;
}