Return all candidate moves from the probe.
[stockfish] / src / main.cpp
index 33a8f52..0e3e3ab 100644 (file)
@@ -49,15 +49,33 @@ public:
                if (!pos.pos_is_ok()) {
                        return Status(StatusCode::INVALID_ARGUMENT, "Invalid FEN");
                }
+
+               bool invert = (pos.side_to_move() == BLACK);
+
+               HashProbeMove *root_move = response->add_move();
+               root_move->set_move(MOVE_NONE);
+               ProbeMove(pos.key(), invert, root_move);
+
+               MoveList<LEGAL> moves(pos);
+               for (const ExtMove* em = moves.begin(); em != moves.end(); ++em) {
+                       HashProbeMove *move = response->add_move();
+                       move->set_move(em->move);
+                       ProbeMove(pos.key_after(em->move), !invert, move);
+               }
+
+               return Status::OK;
+       }
+
+       void ProbeMove(const int64_t key, bool invert, HashProbeMove* response) {
                bool found;
-               TTEntry *entry = TT.probe(pos.key(), found);
+               TTEntry *entry = TT.probe(key, found);
                response->set_found(found);
                if (found) {
                        Value value = entry->value();
                        Value eval = entry->eval();
                        Bound bound = entry->bound();
 
-                       if (pos.side_to_move() == BLACK) {
+                       if (invert) {
                                value = -value;
                                eval = -eval;
                                if (bound == BOUND_UPPER) {
@@ -67,13 +85,12 @@ public:
                                }
                        }
 
-                       response->set_move(entry->move());
+                       response->set_pv_move(entry->move());
                        response->set_depth(entry->depth());
                        response->set_eval(eval);
                        response->set_value(value);
-                       response->set_bound(HashProbeResponse::ValueBound(bound));
+                       response->set_bound(HashProbeMove::ValueBound(bound));
                }
-               return Status::OK;
        }
 };