version 1.4.58b
[polyglot.git] / xboard2uci.c
index 529f041..06a2070 100644 (file)
@@ -27,6 +27,7 @@
 #include "uci.h"\r
 #include "uci2uci.h"\r
 #include "util.h"\r
+#include "xboard2uci.h"\r
 \r
 // defines\r
 \r
@@ -74,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
@@ -164,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
@@ -319,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
@@ -355,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
@@ -454,20 +463,31 @@ void xboard2uci_gui_step(char string[]) {
                 char *pg_name=Star[0];\r
                 polyglot_set_option(pg_name,value);\r
             }else{\r
-                start_protected_command();\r
-                if(!uci_send_option(Uci, name, "%s", value)){\r
+                option_t *opt=option_find(Uci->option,name);\r
+                if(opt){\r
+                    if(my_string_case_equal(opt->type,"check")){\r
+                       value=my_string_equal(value,"1")?"true":"false";\r
+                    }\r
+                    start_protected_command();\r
+                    uci_send_option(Uci, name, "%s", value);\r
+                    end_protected_command();\r
+                }else{\r
                     gui_send(GUI,"Error (unknown option): %s",name); \r
                 }\r
-                end_protected_command();\r
             }\r
         } else if (match(string,"option *")){\r
             char *name=Star[0];\r
-            start_protected_command();\r
+             if(match(name, "Polyglot *")){\r
+                char *pg_name=Star[0];\r
+                polyglot_set_option(pg_name,"<empty>");\r
+            }else{           \r
+              start_protected_command();\r
                 // value is ignored\r
-            if(!uci_send_option(Uci, name, "%s", "<empty>")){\r
-               gui_send(GUI,"Error (unknown option): %s",name); \r
-            }; \r
-            end_protected_command();\r
+              if(!uci_send_option(Uci, name, "%s", "<empty>")){\r
+                gui_send(GUI,"Error (unknown option): %s",name); \r
+              }; \r
+              end_protected_command();\r
+            }\r
         } else if (XB->has_feature_smp && match(string,"cores *")){\r
                 int cores=atoi(Star[0]);\r
                 if(cores>=1){\r
@@ -740,6 +760,7 @@ void xboard2uci_engine_step(char string[]) {
                 gui_send(GUI,"1-0 {polyglot: resign"\r
                          " (illegal engine move black)}");\r
             }\r
+            board_disp(board);\r
             XB->result = TRUE;\r
             mess();\r
         }\r
@@ -761,25 +782,27 @@ void format_xboard_option_line(char * option_line, option_t *opt){
     strcat(option_line,option_string);\r
     sprintf(option_string," -%s",opt->type);\r
     strcat(option_line,option_string);\r
-    if(strcmp(opt->type,"button") && strcmp(opt->type,"combo")){\r
+    if(!IS_BUTTON(opt->type) && strcmp(opt->type,"combo")){\r
         if(strcmp(opt->type,"check")){\r
-            sprintf(option_string," %s",opt->default_);\r
+            sprintf(option_string," %s",opt->value);\r
         }else{\r
             sprintf(option_string," %d",\r
-                    my_string_case_equal(opt->default_,"true")?1:0);\r
+                    my_string_case_equal(opt->value,"true")||\r
+                    my_string_equal(opt->value,"1")\r
+                    ?1:0);\r
         }\r
         strcat(option_line,option_string);\r
     }\r
-    if(!strcmp(opt->type,"spin")){\r
+    if(IS_SPIN(opt->type)){\r
         sprintf(option_string," %s",opt->min);\r
             strcat(option_line,option_string);\r
     }\r
-    if(!strcmp(opt->type,"spin")){\r
+    if(IS_SPIN(opt->type)){\r
         sprintf(option_string," %s",opt->max);\r
         strcat(option_line,option_string);\r
     }\r
     for(j=0;j<opt->var_nb;j++){\r
-        if(!strcmp(opt->var[j],opt->default_)){\r
+        if(!strcmp(opt->var[j],opt->value)){\r
             sprintf(option_string," *%s",opt->var[j]);\r
         }else{\r
             sprintf(option_string," %s",opt->var[j]);\r
@@ -802,10 +825,7 @@ void format_xboard_option_line(char * option_line, option_t *opt){
 \r
 static void send_xboard_options(){\r
 \r
-    char option_line[StringSize]="";\r
-    const char * name;\r
-    option_t *opt;\r
-    \r
+   \r
     gui_send(GUI,"feature done=0");\r
     \r
     gui_send(GUI,"feature analyze=1");\r
@@ -818,6 +838,7 @@ static void send_xboard_options(){
     gui_send(GUI,"feature pause=0");\r
     gui_send(GUI,"feature ping=1");\r
     gui_send(GUI,"feature playother=1");\r
+    gui_send(GUI,"feature sigint=1");\r
     gui_send(GUI,"feature reuse=1");\r
     gui_send(GUI,"feature san=0");\r
     gui_send(GUI,"feature setboard=1");\r
@@ -825,6 +846,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
@@ -848,30 +870,44 @@ static void send_xboard_options(){
         gui_send(GUI,"feature variants=\"normal\"");\r
     }\r
 \r
-    option_start_iter(Uci->option);\r
-    while((opt=option_next(Uci->option))){\r
-        if(my_string_case_equal(opt->name,"UCI_AnalyseMode")) continue;\r
-        if(my_string_case_equal(opt->name,"Ponder")) continue;\r
-        if(my_string_case_equal(opt->name,"Hash")) continue;\r
-        if(my_string_case_equal(opt->name,"NalimovPath")) continue;\r
-        if((name=uci_thread_option(Uci))!=NULL &&\r
-           my_string_case_equal(opt->name,name)) continue;\r
-        \r
-        format_xboard_option_line(option_line,opt);\r
-        \r
-        gui_send(GUI,"%s",option_line);\r
-    }\r
-\r
+    xboard2uci_send_options();\r
+}\r
 \r
-    option_start_iter(Option);\r
-    while((opt=option_next(Option))){\r
-        if(opt->mode &XBOARD){\r
-            format_xboard_option_line(option_line,opt);\r
-            gui_send(GUI,"%s",option_line);\r
-        }\r
-    }       \r
-    gui_send(GUI,"feature done=1"); \r
+void xboard2uci_send_options(){\r
+  char option_line[StringSize]="";\r
+  const char * name;\r
+  option_t *opt;\r
+  \r
+  option_start_iter(Uci->option);\r
+  while((opt=option_next(Uci->option))){\r
+    if(my_string_case_equal(opt->name,"UCI_AnalyseMode")) continue;\r
+    if(my_string_case_equal(opt->name,"UCI_Opponent")) continue;\r
+    if(my_string_case_equal(opt->name,"UCI_Chess960")) continue;\r
+    if(my_string_case_equal(opt->name,"UCI_ShowCurrLine")) continue;\r
+    if(my_string_case_equal(opt->name,"UCI_ShowRefutations")) continue;\r
+    if(my_string_case_equal(opt->name,"UCI_ShredderbasesPath")) continue;\r
+    if(my_string_case_equal(opt->name,"UCI_SetPositionValue")) continue;\r
+    if(my_string_case_equal(opt->name,"UCI_DrawOffers")) continue;\r
+    if(my_string_case_equal(opt->name,"Ponder")) continue;\r
+    if(my_string_case_equal(opt->name,"Hash")) continue;\r
+    if(my_string_case_equal(opt->name,"NalimovPath")) continue;\r
+    if((name=uci_thread_option(Uci))!=NULL &&\r
+       my_string_case_equal(opt->name,name)) continue;\r
+    format_xboard_option_line(option_line,opt);\r
     \r
+    gui_send(GUI,"%s",option_line);\r
+  }\r
+  \r
+  \r
+  option_start_iter(Option);\r
+  while((opt=option_next(Option))){\r
+    if(opt->mode &XBOARD){\r
+      format_xboard_option_line(option_line,opt);\r
+      gui_send(GUI,"%s",option_line);\r
+    }\r
+  }       \r
+  gui_send(GUI,"feature done=1"); \r
+  \r
 }\r
 \r
 // report_best_score()\r
@@ -1190,11 +1226,17 @@ static void search_update() {
 \r
    if (State->state == THINK || State->state == PONDER || State->state == ANALYSE) {\r
 \r
+      // [VdB] moved up as we need the move number\r
+\r
+       game_get_board(Game,Uci->board);\r
+\r
       // opening book\r
 \r
-       if (State->state == THINK && option_get_bool(Option,"Book")) {\r
+       if (State->state == THINK &&\r
+           option_get_bool(Option,"Book") &&\r
+           Uci->board->move_nb<option_get_int(Option,"BookDepth")\r
+           ) {\r
 \r
-         game_get_board(Game,Uci->board);\r
 \r
          move = book_move(Uci->board,option_get_bool(Option,"BookRandom"));\r
 \r
@@ -1249,30 +1291,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
@@ -1463,7 +1538,7 @@ static void send_board(int extra_move) {
 \r
 static void send_info() {\r
     int min_depth;\r
-    if(option_get_bool(Option,"WbWorkArounds")){\r
+    if(option_get_bool(Option,"WbWorkArounds2")){\r
             // Silly bug in some versions of WinBoard.\r
             // depth <=1 clears the engine output window.\r
             // Why shouldn't an engine be allowed to send info at depth 1?\r