From: H.G. Muller Date: Wed, 14 Mar 2012 19:49:25 +0000 (+0100) Subject: Fully implement exclude feature X-Git-Url: http://winboard.nl/cgi-bin?p=polyglot.git;a=commitdiff_plain;h=e67f24b87c5292615714a16c44f134c966a49e41 Fully implement exclude feature Polyglot now understands the commands "exclude|include MOVE|all". The list of excluded moves is cleared on "undo" or any move, and can be interrogated through the "bk" command (when book is off), printing an asterisk in front of each excluded move. An "exclude all" is deferred until there are again enabled moves. New searches are only started when the list of excluded moves actually changes. --- diff --git a/xboard2uci.c b/xboard2uci.c index 4f019a9..dfae34c 100644 --- a/xboard2uci.c +++ b/xboard2uci.c @@ -213,22 +213,21 @@ void xboard2uci_gui_step(char string[]) { game_get_board(Game,board); book_disp(board); } else { // [HGM] without book, print all legal moves - int i; + int i, gen=!list_size(move_list); game_get_board(Game,board); - gen_legal_moves(move_list,board); + if(gen) gen_legal_moves(move_list,board); for(i=0; ivalue[i] = 0; + if(gen) move_list->value[i] = 0; move_to_san(move_list->move[i],board,move_string,256); - printf(" %6s\n",move_string); + printf(" %s%6s\n", move_list->value[i]? "* " : "", move_string); } // this is necessary by the xboard protocol printf("\n"); } - } else if (match(string,"kill *") || match(string,"option Polyglot exclude move=*")) { // [HGM] + } else if (match(string,"exclude *") || match(string,"option Polyglot exclude move=*")) { // [HGM] - if (XB->analyse) { - int i; + int i, all = !strcmp(Star[0], "all"), change=FALSE, cnt=0; game_get_board(Game,board); if(!list_size(move_list)) { gen_legal_moves(move_list,board); @@ -239,10 +238,23 @@ void xboard2uci_gui_step(char string[]) { move = move_from_san(Star[0],board); for(i=0; imove[i] == move) move_list->value[i] = 1; + if(all || move_list->move[i] == move) + change |= !move_list->value[i], move_list->value[i] = 1; + cnt += !move_list->value[i]; } - mess(); + if(change && cnt) mess(); // do not relay to engine if no change or no moves left + + } else if (match(string,"include *")) { // [HGM] + + int i, all = !strcmp(Star[0], "all"), change = FALSE; + game_get_board(Game,board); + move = move_from_san(Star[0],board); + + for(i=0; imove[i] == move) + change |= move_list->value[i], move_list->value[i] = 0; } + if(change) mess(); } else if (match(string,"black")) { @@ -360,6 +372,8 @@ void xboard2uci_gui_step(char string[]) { game_clear(Game); + move_list->size = 0; // [HGM] clear all exclude moves + if (XB->analyse) { State->computer[White] = FALSE; State->computer[Black] = FALSE; @@ -613,6 +627,8 @@ void xboard2uci_gui_step(char string[]) { if (!game_init(Game,Star[0])) my_fatal("xboard_step(): bad FEN \"%s\"\n",Star[0]); + move_list->size = 0; // [HGM] clear all exclude moves + State->computer[White] = FALSE; State->computer[Black] = FALSE;