}
root_turn = Flip( root_turn );
+ move_list[move_ptr++] = move; // [HGM] undo: remember all moves played in root
/* detect checkmate */
if ( check && is_mate( ptree, 1 ) ) { game_status |= flag_mated; }
root_nrep -= 1;
game_status &= ~( flag_drawn | flag_mated );
root_turn = Flip(root_turn);
+ move_ptr--; // [HGM] undo: clip last move off game history
ptree->save_material[1] = ptree->save_material[0];
UnMakeMove( root_turn, move, 1 );
static int cmd_read( tree_t * restrict ptree, char **lasts );
static int cmd_resign( tree_t * restrict ptree, char **lasts );
static int cmd_time( char **lasts );
+static int cmd_undo( tree_t * restrict ptree ); // [HGM] undo
static int is_move( const char *str );
return proce_cui( ptree );
}
+char *start_pos, start_data[512]; // [HGM] undo: for remembering start position
+int move_list[1024], move_ptr;
+
#ifdef XBOARD
#define IF(X) else if(!strcmp(command, X))
sprintf(line, "%c%c%c%c%s", 'a'+'9'-fromX, '1'+'9'-fromY, 'a'+'9'-toX, '1'+'9'-toY,
astr_table_piece[abs(BOARD[from]) + (promo == '+' ? promote : 0)]);
}
- plyNr++; return 0;
+ plyNr++;
+ return 0;
}
IF("undo") { ; }
IF("remove") { ; }
if ( ! strcmp( token, "resign" ) ) { return cmd_resign( ptree, &last ); }
if ( ! strcmp( token, "suspend" ) ) { return cmd_suspend(); }
if ( ! strcmp( token, "time" ) ) { return cmd_time( &last ); }
+ if ( ! strcmp( token, "undo" ) ) { return cmd_undo( ptree ); } // [HGM] undo
#if defined(CSA_LAN)
if ( ! strcmp( token, "connect" ) ) { return cmd_connect( ptree, &last ); }
#endif
static int
+cmd_undo( tree_t * restrict ptree )
+{ // [HGM] undo: restart the game, and feed all moves except the last
+ int i, last = move_ptr;
+ char *p = start_data;
+ if( move_ptr <= 0 ) {
+ str_error = "undo past start of game ignored";
+ return -2;
+ }
+
+ AbortDifficultCommand;
+
+ last--;
+ cmd_new( ptree, &p );
+ for(i=0; i<last; i++) {
+ make_move_root( ptree, move_list[i], 0);
+ }
+ return 1;
+}
+
+
+static int
is_move( const char *str )
{
if ( isdigit( (int)str[0] ) && isdigit( (int)str[1] )
AbortDifficultCommand;
+ start_pos = *lasts; move_ptr = 0; // [HGM] undo: remember start position
+
if ( str1 != NULL )
{
+ strncpy(start_data, str1, 511); // [HGM] undo: remember start position
memset( &min_posi.asquare, empty, nsquare );
min_posi.hand_black = min_posi.hand_white = 0;
iret = read_board_rep1( str1, &min_posi );
extern const char ashell_h[ SHELL_H_LEN ];
extern const unsigned char aifile[ nsquare ];
extern const unsigned char airank[ nsquare ];
+extern int move_list[], move_ptr; // [HGM] undo: game history (used in proce.c and makemove.c)
void pv_close( tree_t * restrict ptree, int ply, int type );
void pv_copy( tree_t * restrict ptree, int ply );