version 1.4.51b
[polyglot.git] / xboard2uci.c
index e490906..c8c8354 100644 (file)
@@ -75,6 +75,8 @@ typedef struct {
     \r
     double my_time;\r
     double opp_time;\r
+\r
+    int node_rate;\r
 } xb_t;\r
 \r
 typedef enum { WAIT, THINK, PONDER, ANALYSE } dummy_state_t;\r
@@ -165,6 +167,8 @@ void xboard2uci_init() {
 \r
    XB->my_time = 300.0;\r
    XB->opp_time = 300.0;\r
+\r
+   XB->node_rate = -1;\r
 }\r
 \r
 // xboard2uci_gui_step()\r
@@ -320,6 +324,7 @@ void xboard2uci_gui_step(char string[]) {
                        XB->result = FALSE;\r
 \r
                        XB->depth_limit = FALSE;\r
+            XB->node_rate=-1;\r
 \r
                        XB->computer = FALSE;\r
                        my_string_set(&XB->name,"<empty>");\r
@@ -356,7 +361,10 @@ void xboard2uci_gui_step(char string[]) {
                                ASSERT(XB->ping==-1);\r
                                gui_send(GUI,"pong %s",Star[0]);\r
                        }\r
-\r
+        } else if (match(string,"nps *")) {\r
+            \r
+                // fake WB play-by-nodes mode\r
+            XB->node_rate = atoi(Star[0]);\r
                } else if (match(string,"playother")) {\r
 \r
                        State->computer[game_turn(Game)] = FALSE;\r
@@ -837,6 +845,7 @@ static void send_xboard_options(){
     gui_send(GUI,"feature sigterm=0");\r
     gui_send(GUI,"feature time=1");\r
     gui_send(GUI,"feature usermove=1");\r
+    gui_send(GUI,"feature nps=1");\r
     if (XB->has_feature_memory){\r
         gui_send(GUI,"feature memory=1");\r
     }else{\r
@@ -1281,30 +1290,63 @@ static void search_update() {
          if (XB->time_limit) {\r
 \r
             // fixed time per move\r
-\r
-            engine_send_queue(Engine," movetime %.0f",XB->time_max*1000.0);\r
+             \r
+             if(XB->node_rate > 0){\r
+                 engine_send_queue(Engine,\r
+                                   " nodes %.0f",\r
+                                   XB->time_max*((double)XB->node_rate));\r
+             }else{\r
+                 engine_send_queue(Engine,\r
+                                   " movetime %.0f",\r
+                                   XB->time_max*1000.0);\r
+             }\r
 \r
          } else {\r
 \r
             // time controls\r
 \r
-            if (colour_is_white(Uci->board->turn)) {\r
-               engine_send_queue(Engine," wtime %.0f btime %.0f",XB->my_time*1000.0,XB->opp_time*1000.0);\r
-            } else {\r
-               engine_send_queue(Engine," wtime %.0f btime %.0f",XB->opp_time*1000.0,XB->my_time*1000.0);\r
-            }\r
-\r
-            if (XB->inc != 0.0) engine_send_queue(Engine," winc %.0f binc %.0f",XB->inc*1000.0,XB->inc*1000.0);\r
-\r
-            if (XB->mps != 0) {\r
-\r
-               move_nb = XB->mps - (Uci->board->move_nb % XB->mps);\r
-               ASSERT(move_nb>=1&&move_nb<=XB->mps);\r
-\r
-               engine_send_queue(Engine," movestogo %d",move_nb);\r
-            }\r
+                 if(XB->node_rate > 0) {\r
+                     double time;\r
+                     move_nb = 40;\r
+                     if (XB->mps != 0){\r
+                         move_nb = XB->mps - (Uci->board->move_nb % XB->mps);\r
+                     }\r
+                     time = XB->my_time / move_nb;\r
+                     if(XB->inc != 0){\r
+                         time += XB->inc;\r
+                     }\r
+                     if(time > XB->my_time){\r
+                         time = XB->my_time;\r
+                     }\r
+                     engine_send_queue(Engine,\r
+                                       " nodes %.0f",\r
+                                       time*XB->node_rate);\r
+                 } else {\r
+                     \r
+                     if (colour_is_white(Uci->board->turn)) {\r
+                         engine_send_queue(Engine,\r
+                                           " wtime %.0f btime %.0f",\r
+                                           XB->my_time*1000.0,XB->opp_time*1000.0);\r
+                     } else {\r
+                         engine_send_queue(Engine,\r
+                                           " wtime %.0f btime %.0f",\r
+                                           XB->opp_time*1000.0,XB->my_time*1000.0);\r
+                     }\r
+                     \r
+                     if (XB->inc != 0.0){\r
+                         engine_send_queue(Engine,\r
+                                           " winc %.0f binc %.0f",\r
+                                           XB->inc*1000.0,XB->inc*1000.0);\r
+                     }\r
+                     if (XB->mps != 0) {\r
+\r
+                         move_nb = XB->mps - (Uci->board->move_nb % XB->mps);\r
+                         ASSERT(move_nb>=1&&move_nb<=XB->mps);\r
+                         \r
+                         engine_send_queue(Engine," movestogo %d",move_nb);\r
+                     }\r
+                 }\r
          }\r
-\r
          if (XB->depth_limit) engine_send_queue(Engine," depth %d",XB->depth_max);\r
 \r
          if (State->state == PONDER) engine_send_queue(Engine," ponder");\r