#include "uci.h"\r
#include "uci2uci.h"\r
#include "util.h"\r
+#include "xboard2uci.h"\r
\r
// defines\r
\r
\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
\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
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
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
}\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
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->value);\r
}else{\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
\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
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
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,"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
+ xboard2uci_send_options();\r
+}\r
\r
- option_start_iter(Option);\r
- while((opt=option_next(Option))){\r
- if(opt->mode &XBOARD){\r
- if(my_string_case_equal(opt->name,"Persist") &&\r
- my_string_case_equal(option_get_default(Option,opt->name),\r
- "false")){\r
- continue;\r
- }\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
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