Support bughouse-specific XBoard commands
authorFabian Fichter <ianfab@users.noreply.github.com>
Thu, 26 Dec 2019 12:35:44 +0000 (13:35 +0100)
committerFabian Fichter <ianfab@users.noreply.github.com>
Thu, 26 Dec 2019 12:35:44 +0000 (13:35 +0100)
src/position.cpp
src/position.h
src/xboard.cpp

index 5131555..02f849e 100644 (file)
@@ -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 << ']';
   }
 
index f662fbc..4c265f9 100644 (file)
@@ -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;
index a7c0769..970da98 100644 (file)
@@ -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 [<white>] [<black>] <color><piece>
+      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")
   {