X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=32cabf74032f3497c2a0f14da996ecb42f200158;hb=2827780f4ce2a51ac7f5ea1a85040682597de2a2;hp=29638b801c454b50fd597d6eaed12c074740d95a;hpb=d30d12e2d31771571fec432198b17a485a8881c7;p=xboard.git diff --git a/moves.c b/moves.c index 29638b8..32cabf7 100644 --- a/moves.c +++ b/moves.c @@ -170,6 +170,8 @@ CompareBoards (Board board1, Board board2) // [HGM] gen: configurable move generation from Betza notation sent by engine. +Boolean pieceDefs; + // alphabet "abcdefghijklmnopqrstuvwxyz" char symmetry[] = "FBNW.FFW.NKN.NW.QR....W..N"; char xStep[] = "2110.130.102.10.00....0..2"; @@ -532,7 +534,10 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, if(PieceToChar(piece) == '~') piece = (ChessSquare) ( DEMOTED piece ); if(filter != EmptySquare && piece != filter) continue; - if(pieceDesc[piece]) { MovesFromString(board, flags, ff, rf, pieceDesc[piece], callback, closure); continue; } // [HGM] gen + if(pieceDefs && pieceDesc[piece]) { // [HGM] gen: use engine-defined moves + MovesFromString(board, flags, ff, rf, pieceDesc[piece], callback, closure); + continue; + } if(IS_SHOGI(gameInfo.variant)) piece = (ChessSquare) ( SHOGI piece ); @@ -1876,6 +1881,12 @@ Disambiguate (Board board, int flags, DisambiguateClosure *closure) return; } } + } else if(pieceDefs && closure->count > 1) { // [HGM] gen: move is ambiguous under engine-defined rules + DisambiguateClosure spare = *closure; + pieceDefs = FALSE; spare.count = 0; // See if the (erroneous) built-in rules would resolve that + GenLegal(board, flags, DisambiguateCallback, (VOIDSTAR) &spare, closure->pieceIn); + if(spare.count == 1) *closure = spare; // It does, so use those in stead (game from file saved before gen patch?) + pieceDefs = TRUE; } if (c == 'x') c = NULLCHAR; // get rid of any 'x' (which should never happen?)