X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=a3eebccac4a82cefebe47fb9b609bfd31d7a100e;hb=89f4b438a9bc3ed2b2b2bd79f22a1a6af06e9bcb;hp=054ee6b746da277cb44b1ea0eb5a73aff6c1ede7;hpb=c5f9e4b9c745527e59d5b192d62f68b6db5fdf00;p=xboard.git diff --git a/moves.c b/moves.c index 054ee6b..a3eebcc 100644 --- a/moves.c +++ b/moves.c @@ -250,6 +250,7 @@ MovesFromString (Board board, int flags, int f, int r, char *desc, MoveCallback if(!mode) mode = his + 4;// no mode spec, use default = mc if(*desc == 'p') mode |= 32, desc++; if(*desc == 'g') mode |= 64, desc++; + if(*desc == 'o') mode |= 128, desc++; if(*desc == 'n') jump = 0, desc++; while(*desc == 'j') jump++, desc++; dx = xStep[*p-'A'] - '0'; // step vector of atom @@ -257,7 +258,9 @@ MovesFromString (Board board, int flags, int f, int r, char *desc, MoveCallback if(isdigit(*++p)) expo = atoi(p++); // read exponent if(expo > 9) p++; // allow double-digit desc = p; // this is start of next move - if(initial && board[r][f] != initialPosition[r][f]) continue; + if(initial && (board[r][f] != initialPosition[r][f] || + r == 0 && board[TOUCHED_W] & 1< 1 && dx == 0 && dy == 0) { // castling indicated by O + number mode |= 16; dy = 1; } @@ -270,7 +273,9 @@ MovesFromString (Board board, int flags, int f, int r, char *desc, MoveCallback x = f; y = r; // start square do { x += vx; y += vy; // step to next square - if(y < 0 || y >= BOARD_HEIGHT || x < BOARD_LEFT || x >= BOARD_RGHT) break; + if(y < 0 || y >= BOARD_HEIGHT) break; // vertically off-board: always done + if(x < BOARD_LEFT) { if(mode & 128) x += BOARD_RGHT - BOARD_LEFT; else break; } + if(x >= BOARD_RGHT) { if(mode & 128) x -= BOARD_RGHT - BOARD_LEFT; else break; } if(!jump && board[y - vy + vy/2][x - vx + vx/2] != EmptySquare) break; // blocked if(jump > 1 && board[y - vy + vy/2][x - vx + vx/2] == EmptySquare) break; // no hop if(board[y][x] < BlackPawn) occup = 1; else