From 7e7dfae9c49b8496d37bd0d78eb6ac7b0f149444 Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Thu, 26 Dec 2019 13:35:44 +0100 Subject: [PATCH] Support bughouse-specific XBoard commands --- src/position.cpp | 11 +++++++---- src/position.h | 2 +- src/xboard.cpp | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/position.cpp b/src/position.cpp index 5131555..02f849e 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -612,7 +612,7 @@ Position& Position::set(const string& code, Color c, StateInfo* si) { /// Position::fen() returns a FEN representation of the position. In case of /// Chess960 the Shredder-FEN notation is used. This is mainly a debugging function. -const string Position::fen(bool sfen) const { +const string Position::fen(bool sfen, std::string holdings) const { int emptyCnt; std::ostringstream ss; @@ -664,9 +664,12 @@ const string Position::fen(bool sfen) const { if (piece_drops() || seirawan_gating()) { ss << '['; - for (Color c : {WHITE, BLACK}) - for (PieceType pt = KING; pt >= PAWN; --pt) - ss << std::string(pieceCountInHand[c][pt], piece_to_char()[make_piece(c, pt)]); + if (holdings != "-") + ss << holdings; + else + for (Color c : {WHITE, BLACK}) + for (PieceType pt = KING; pt >= PAWN; --pt) + ss << std::string(pieceCountInHand[c][pt], piece_to_char()[make_piece(c, pt)]); ss << ']'; } diff --git a/src/position.h b/src/position.h index f662fbc..4c265f9 100644 --- a/src/position.h +++ b/src/position.h @@ -89,7 +89,7 @@ public: // FEN string input/output 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(bool sfen = false) const; + const std::string fen(bool sfen = false, std::string holdings = "-") const; // Variant rule properties const Variant* variant() const; diff --git a/src/xboard.cpp b/src/xboard.cpp index a7c0769..970da98 100644 --- a/src/xboard.cpp +++ b/src/xboard.cpp @@ -217,6 +217,24 @@ void StateMachine::process_command(Position& pos, std::string token, std::istrin go(pos, analysisLimits, states); } } + // Bughouse commands + else if (token == "partner") {} // ignore for now + else if (token == "ptell") + { + // TODO: parse requests by partner + } + else if (token == "holding") + { + // holding [] [] + std::string white_holdings, black_holdings; + if ( std::getline(is, token, '[') && std::getline(is, white_holdings, ']') + && std::getline(is, token, '[') && std::getline(is, black_holdings, ']')) + { + std::transform(black_holdings.begin(), black_holdings.end(), black_holdings.begin(), ::tolower); + std::string fen = pos.fen(false, white_holdings + black_holdings); + setboard(pos, states, fen); + } + } // Additional custom non-XBoard commands else if (token == "perft") { -- 1.7.0.4