X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=876564cf24553a4ed05f573803916b69fb6b2c83;hb=bebe9603e5df7b96ae3abd6949b7e2bab015333c;hp=6a747a276705ae16d89898290a2a9329ce6fa5d4;hpb=5dfa0c9055904ec0c8d34439f7f2eaa835bb783c;p=xboard.git diff --git a/moves.c b/moves.c index 6a747a2..876564c 100644 --- a/moves.c +++ b/moves.c @@ -809,9 +809,10 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, rf, ff, rf + 1, ff + s, closure); } if (rf >= BOARD_HEIGHT+1>>1) {// [HGM] grand: 4th & 5th rank on 10-board + int victimFile = (board[LAST_FILE] == 100 ? ff + s : board[LAST_FILE]); if (ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && - (epfile == ff + s || epfile == EP_UNKNOWN) && rf < BOARD_HEIGHT-3 && - board[rf][ff + s] == BlackPawn && + (board[EP_FILE] == ff + s || epfile == EP_UNKNOWN) && rf < BOARD_HEIGHT-3 && + (board[rf][victimFile] == BlackPawn || board[rf][victimFile] == BlackLance) && board[rf+1][ff + s] == EmptySquare) { callback(board, flags, WhiteCapturesEnPassant, rf, ff, rf+1, ff + s, closure); @@ -859,9 +860,10 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, rf, ff, rf - 1, ff + s, closure); } if (rf < BOARD_HEIGHT>>1) { + int victimFile = (board[LAST_FILE] == 100 ? ff + s : board[LAST_FILE]); if (ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && - (epfile == ff + s || epfile == EP_UNKNOWN) && rf > 2 && - board[rf][ff + s] == WhitePawn && + (board[EP_FILE] == ff + s || epfile == EP_UNKNOWN) && rf > 2 && + (board[rf][victimFile] == WhitePawn || board[rf][victimFile] == WhiteLance) && board[rf-1][ff + s] == EmptySquare) { callback(board, flags, BlackCapturesEnPassant, rf, ff, rf-1, ff + s, closure); @@ -986,6 +988,14 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, case WhiteWazir: case BlackWazir: + if(gameInfo.variant == VariantXiangqi) { + int palace = (piece == WhiteWazir ? 1 : BOARD_HEIGHT-2); // Palace center + if(ff <= BOARD_WIDTH/2 && !SameColor(board[rf][ff+1], piece)) callback(board, flags, NormalMove, rf, ff, rf, ff+1, closure); + if(ff >= BOARD_WIDTH/2 && !SameColor(board[rf][ff-1], piece)) callback(board, flags, NormalMove, rf, ff, rf, ff-1, closure); + if(rf >= palace && !SameColor(board[rf-1][ff], piece)) callback(board, flags, NormalMove, rf, ff, rf-1, ff, closure); + if(rf <= palace && !SameColor(board[rf+1][ff], piece)) callback(board, flags, NormalMove, rf, ff, rf+1, ff, closure); + break; + } Wazir(board, flags, rf, ff, callback, closure); break; @@ -1727,6 +1737,8 @@ CheckTest (Board board, int flags, int rf, int ff, int rt, int ft, int enPassant } } + if(PieceToChar(king) == '.') return 0; // never in check if the royal piece does not participate + if (rt >= 0) { if (enPassant) { captured = board[rf][ft]; @@ -2155,6 +2167,11 @@ Disambiguate (Board board, int flags, DisambiguateClosure *closure) } } else if(pieceDefs && closure->count > 1 && closure->rtIn >=0) { // [HGM] gen: move is ambiguous under engine-defined rules (and not one-click) DisambiguateClosure spare = *closure; + if(gameInfo.variant == VariantXiangqi && closure->pieceIn == EmptySquare && closure->ffIn < 0) { + closure->ffIn = closure->ftIn; //closure->pieceIn = (flags & 1 ? BlackPawn : WhitePawn); // forward Pawn push has priority + Disambiguate(board, flags, closure); + return; + } 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?)