X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=edccef83673c0ce69852c8501a12fccb2ac03f0f;hb=refs%2Ftags%2Fv4.3.14;hp=ddf3ee98317a26eb9bbba44d894780cc12837840;hpb=c0b53f04e40ff60571a872aa32718792dced1b1e;p=xboard.git diff --git a/moves.c b/moves.c index ddf3ee9..edccef8 100644 --- a/moves.c +++ b/moves.c @@ -196,12 +196,11 @@ ChessMove PromoCharToMoveType(whiteOnMove, promoChar) } char pieceToChar[] = { - 'P', 'N', 'B', 'R', 'Q', 'F', - 'W', 'E', 'M', 'O', 'U', 'H', 'A', 'C', 'G', 'S', - 'K', 'p', 'n', 'b', 'r', 'q', 'f', - 'w', 'e', 'm', 'o', 'u', 'h', 'a', 'c', 'g', 's', - 'k', 'x' - }; + 'P', 'N', 'B', 'R', 'Q', 'F', 'E', 'A', 'C', 'W', 'M', + 'O', 'H', 'I', 'J', 'G', 'D', 'V', 'S', 'L', 'U', 'K', + 'p', 'n', 'b', 'r', 'q', 'f', 'e', 'a', 'c', 'w', 'm', + 'o', 'h', 'i', 'j', 'g', 'd', 'v', 's', 'l', 'u', 'k', + 'x' }; char PieceToChar(p) ChessSquare p; @@ -210,7 +209,7 @@ char PieceToChar(p) return pieceToChar[(int) p]; } -int PieceToNumber(p) +int PieceToNumber(p) /* [HGM] holdings: count piece type, ignoring non-participating piece types */ ChessSquare p; { int i=0; @@ -281,9 +280,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) if (!BlackPiece(board[rf][ff])) continue; } m = 0; piece = board[rf][ff]; - if(gameInfo.variant == VariantCrazyhouse && - ( (int) piece > (int) WhiteQueen && (int) piece < (int) WhiteKing - || (int) piece > (int) BlackQueen && (int) piece < (int) BlackKing )) + if(PieceToChar(piece) == '~') piece = (ChessSquare) ( DEMOTED piece ); if(gameInfo.variant == VariantShogi) piece = (ChessSquare) ( SHOGI piece ); @@ -294,7 +291,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) /* can't happen ([HGM] except for faries...) */ break; - case WhitePawn: + case WhitePawn: if(gameInfo.variant == VariantXiangqi) { /* [HGM] capture and move straight ahead in Xiangqi */ if (rf < BOARD_HEIGHT-1 && @@ -521,8 +518,8 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) m++; /* Capablanca Archbishop continues as Knight */ - case WhiteCardinal: - case BlackCardinal: + case WhiteAngel: + case BlackAngel: m++; /* Shogi Bishops are ordinary Bishops */ @@ -572,8 +569,8 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) break; /* Shogi Dragon King has to continue as Ferz after Rook moves */ - case SHOGI WhiteMarshall: - case SHOGI BlackMarshall: + case SHOGI WhiteDragon: + case SHOGI BlackDragon: m++; /* Capablanca Chancellor sets flag to continue as Knight */ @@ -645,7 +642,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) for (fs = -1; fs <= 1; fs += 2) { rt = rf + rs; ft = ff + fs; - if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; + if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) continue; if (!SameColor(board[rf][ff], board[rt][ft]) && (gameInfo.variant != VariantXiangqi || InPalace(rt, ft) ) ) callback(board, flags, NormalMove, @@ -671,6 +668,24 @@ void GenPseudoLegal(board, flags, epfile, callback, closure) rf, ff, rt, ft, closure); } break; + + case WhiteNightrider: + case BlackNightrider: + for (i = -1; i <= 1; i += 2) + for (j = -1; j <= 1; j += 2) + for (s = 1; s <= 2; s++) { int k; + for(k=1;; k++) { + rt = rf + k*i*s; + ft = ff + k*j*(3-s); + if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; + if (SameColor(board[rf][ff], board[rt][ft])) break; + callback(board, flags, NormalMove, + rf, ff, rt, ft, closure); + if (board[rt][ft] != EmptySquare) break; + } + } + break; + } } } @@ -738,8 +753,9 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) VOIDSTAR closure; { GenLegalClosure cl; - int ff, ft; + int ff, ft, k, left, right; int ignoreCheck = (flags & F_IGNORE_CHECK) != 0; + ChessSquare wKing = WhiteKing, bKing = BlackKing; cl.cb = callback; cl.cl = closure; @@ -749,10 +765,14 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) CheckTest(board, flags, -1, -1, -1, -1, FALSE)) return TRUE; /* Generate castling moves */ + if(gameInfo.variant == VariantKnightmate) { /* [HGM] Knightmate */ + wKing = WhiteUnicorn; bKing = BlackUnicorn; + } + for (ff = BOARD_WIDTH>>1; ff >= (BOARD_WIDTH-1)>>1; ff-- /*ics wild 1*/) { if ((flags & F_WHITE_ON_MOVE) && (flags & F_WHITE_KCASTLE_OK) && - board[0][ff] == WhiteKing && + board[0][ff] == wKing && board[0][ff + 1] == EmptySquare && board[0][ff + 2] == EmptySquare && board[0][BOARD_RGHT-3] == EmptySquare && @@ -763,15 +783,16 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) (ignoreCheck || (!CheckTest(board, flags, 0, ff, 0, ff + 1, FALSE) && !CheckTest(board, flags, 0, ff, 0, BOARD_RGHT-3, FALSE) && + (gameInfo.variant != VariantJanus || !CheckTest(board, flags, 0, ff, 0, BOARD_RGHT-2, FALSE)) && !CheckTest(board, flags, 0, ff, 0, ff + 2, FALSE)))) { callback(board, flags, ff==BOARD_WIDTH>>1 ? WhiteKingSideCastle : WhiteKingSideCastleWild, - 0, ff, 0, ff + ((gameInfo.boardWidth+2)>>2), closure); + 0, ff, 0, ff + ((gameInfo.boardWidth+2)>>2) + (gameInfo.variant == VariantJanus), closure); } if ((flags & F_WHITE_ON_MOVE) && (flags & F_WHITE_QCASTLE_OK) && - board[0][ff] == WhiteKing && + board[0][ff] == wKing && board[0][ff - 1] == EmptySquare && board[0][ff - 2] == EmptySquare && board[0][BOARD_LEFT+2] == EmptySquare && @@ -781,7 +802,7 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) ( castlingRights[2] == ff || castlingRights[6] == ff ) && (ignoreCheck || (!CheckTest(board, flags, 0, ff, 0, ff - 1, FALSE) && - !CheckTest(board, flags, 0, ff, 0, BOARD_LEFT+3, FALSE) && + !CheckTest(board, flags, 0, ff, 0, BOARD_LEFT+3, FALSE) && !CheckTest(board, flags, 0, ff, 0, ff - 2, FALSE)))) { callback(board, flags, @@ -790,7 +811,7 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) } if (!(flags & F_WHITE_ON_MOVE) && (flags & F_BLACK_KCASTLE_OK) && - board[BOARD_HEIGHT-1][ff] == BlackKing && + board[BOARD_HEIGHT-1][ff] == bKing && board[BOARD_HEIGHT-1][ff + 1] == EmptySquare && board[BOARD_HEIGHT-1][ff + 2] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_RGHT-3] == EmptySquare && @@ -801,15 +822,16 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) (ignoreCheck || (!CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + 1, FALSE) && !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_RGHT-3, FALSE) && + (gameInfo.variant != VariantJanus || !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_RGHT-2, FALSE)) && !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + 2, FALSE)))) { callback(board, flags, ff==BOARD_WIDTH>>1 ? BlackKingSideCastle : BlackKingSideCastleWild, - BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + ((gameInfo.boardWidth+2)>>2), closure); + BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + ((gameInfo.boardWidth+2)>>2) + (gameInfo.variant == VariantJanus), closure); } if (!(flags & F_WHITE_ON_MOVE) && (flags & F_BLACK_QCASTLE_OK) && - board[BOARD_HEIGHT-1][ff] == BlackKing && + board[BOARD_HEIGHT-1][ff] == bKing && board[BOARD_HEIGHT-1][ff - 1] == EmptySquare && board[BOARD_HEIGHT-1][ff - 2] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_LEFT+2] == EmptySquare && @@ -819,8 +841,8 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) ( castlingRights[5] == ff || castlingRights[7] == ff ) && (ignoreCheck || (!CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 1, FALSE) && - !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_LEFT+3, FALSE) && - !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 1, FALSE)))) { + !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_LEFT+3, FALSE) && + !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 2, FALSE)))) { callback(board, flags, ff==BOARD_WIDTH>>1 ? BlackQueenSideCastle : BlackQueenSideCastleWild, @@ -828,41 +850,71 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure) } } - /* PUSH Fabien */ + if(gameInfo.variant == VariantFischeRandom) { /* generate all potential FRC castling moves (KxR), ignoring flags */ - /* [HGM] Tord! Help requested! */ + /* [HGM] test if the Rooks we find have castling rights */ - if ((flags & F_WHITE_ON_MOVE) != 0) { - - for (ff = BOARD_LEFT+1; ff < BOARD_RGHT-1; ff++) { - if (board[0][ff] == WhiteKing) { - for (ft = BOARD_LEFT+0; ft < BOARD_RGHT; ft++) { - if (board[0][ft] == WhiteRook) { - callback(board, flags, - (ft > ff) ? WhiteHSideCastleFR : WhiteASideCastleFR, - 0, ff, 0, ft, closure); - } - } - } - } + if ((flags & F_WHITE_ON_MOVE) != 0) { + ff = castlingRights[2]; /* King file if we have any rights */ + if(ff > 0 && board[0][ff] == WhiteKing) { + if (appData.debugMode) { + fprintf(debugFP, "FRC castling, %d %d %d %d %d %d\n", + castlingRights[0],castlingRights[1],ff,castlingRights[3],castlingRights[4],castlingRights[5]); + } + ft = castlingRights[0]; /* Rook file if we have H-side rights */ + left = ff+1; + right = BOARD_RGHT-2; + if(ff == BOARD_RGHT-2) left = right = ff-1; /* special case */ + for(k=left; k<=right && ft >= 0; k++) /* first test if blocked */ + if(k != ft && board[0][k] != EmptySquare) ft = -1; + for(k=left; k= 0; k++) /* then if not checked */ + if(!ignoreCheck && CheckTest(board, flags, 0, ff, 0, k, FALSE)) ft = -1; + if(ft >= 0 && board[0][ft] == WhiteRook) + callback(board, flags, WhiteHSideCastleFR, 0, ff, 0, ft, closure); + + ft = castlingRights[1]; /* Rook file if we have A-side rights */ + left = BOARD_LEFT+2; + right = ff-1; + if(ff <= BOARD_LEFT+2) { left = ff+1; right = BOARD_LEFT+3; } + for(k=left; k<=right && ft >= 0; k++) /* first test if blocked */ + if(k != ft && board[0][k] != EmptySquare) ft = -1; + if(ff > BOARD_LEFT+2) + for(k=left+1; k<=right && ft >= 0; k++) /* then if not checked */ + if(!ignoreCheck && CheckTest(board, flags, 0, ff, 0, k, FALSE)) ft = -1; + if(ft >= 0 && board[0][ft] == WhiteRook) + callback(board, flags, WhiteASideCastleFR, 0, ff, 0, ft, closure); + } } else { - - for (ff = BOARD_LEFT+1; ff < BOARD_RGHT-1; ff++) { - if (board[BOARD_HEIGHT-1][ff] == BlackKing) { - for (ft = BOARD_LEFT+0; ft < BOARD_RGHT; ft++) { - if (board[BOARD_HEIGHT-1][ft] == BlackRook) { - callback(board, flags, - (ft > ff) ? BlackHSideCastleFR : BlackASideCastleFR, - BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ft, closure); - } - } - } - } + ff = castlingRights[5]; /* King file if we have any rights */ + if(ff > 0 && board[BOARD_HEIGHT-1][ff] == BlackKing) { + ft = castlingRights[3]; /* Rook file if we have H-side rights */ + left = ff+1; + right = BOARD_RGHT-2; + if(ff == BOARD_RGHT-2) left = right = ff-1; /* special case */ + for(k=left; k<=right && ft >= 0; k++) /* first test if blocked */ + if(k != ft && board[BOARD_HEIGHT-1][k] != EmptySquare) ft = -1; + for(k=left; k= 0; k++) /* then if not checked */ + if(!ignoreCheck && CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, k, FALSE)) ft = -1; + if(ft >= 0 && board[BOARD_HEIGHT-1][ft] == BlackRook) + callback(board, flags, BlackHSideCastleFR, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ft, closure); + + ft = castlingRights[4]; /* Rook file if we have A-side rights */ + left = BOARD_LEFT+2; + right = ff-1; + if(ff <= BOARD_LEFT+2) { left = ff+1; right = BOARD_LEFT+3; } + for(k=left; k<=right && ft >= 0; k++) /* first test if blocked */ + if(k != ft && board[BOARD_HEIGHT-1][k] != EmptySquare) ft = -1; + if(ff > BOARD_LEFT+2) + for(k=left+1; k<=right && ft >= 0; k++) /* then if not checked */ + if(!ignoreCheck && CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, k, FALSE)) ft = -1; + if(ft >= 0 && board[BOARD_HEIGHT-1][ft] == BlackRook) + callback(board, flags, BlackASideCastleFR, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ft, closure); + } } - /* POP Fabien */ + } return FALSE; } @@ -978,9 +1030,9 @@ void LegalityTestCallback(board, flags, kind, rf, ff, rt, ft, closure) { register LegalityTestClosure *cl = (LegalityTestClosure *) closure; - if (appData.debugMode) { - fprintf(debugFP, "Legality test: %c%c%c%c\n", ff+AAA, rf+ONE, ft+AAA, rt+ONE); - } +// if (appData.debugMode) { +// fprintf(debugFP, "Legality test: %c%c%c%c\n", ff+AAA, rf+ONE, ft+AAA, rt+ONE); +// } if (rf == cl->rf && ff == cl->ff && rt == cl->rt && ft == cl->ft) cl->kind = kind; } @@ -991,8 +1043,20 @@ ChessMove LegalityTest(board, flags, epfile, castlingRights, rf, ff, rt, ft, pro int rf, ff, rt, ft, promoChar; char castlingRights[]; { - LegalityTestClosure cl; + LegalityTestClosure cl; ChessSquare piece = board[rf][ff]; + if (appData.debugMode) { + int i; + for(i=0; i<6; i++) fprintf(debugFP, "%d ", castlingRights[i]); + fprintf(debugFP, "Legality test? %c%c%c%c\n", ff+AAA, rf+ONE, ft+AAA, rt+ONE); + } + /* [HGM] Lance, Cobra and Falcon are wildcard pieces; consider all their moves legal */ + /* (perhaps we should disallow moves that obviously leave us in check?) */ + if(piece == WhiteFalcon || piece == BlackFalcon || + piece == WhiteCobra || piece == BlackCobra || + piece == WhiteLance || piece == BlackLance) + return NormalMove; + cl.rf = rf; cl.ff = ff; cl.rt = rt; @@ -1080,7 +1144,7 @@ int MateTest(board, flags, epfile, castlingRights) if (cl.count > 0) { return inCheck ? MT_CHECK : MT_NONE; } else { - return inCheck || gameInfo.variant == VariantXiangqi ? + return inCheck || gameInfo.variant == VariantXiangqi || gameInfo.variant == VariantShatranj ? MT_CHECKMATE : MT_STALEMATE; } } @@ -1099,7 +1163,10 @@ void DisambiguateCallback(board, flags, kind, rf, ff, rt, ft, closure) { register DisambiguateClosure *cl = (DisambiguateClosure *) closure; - if ((cl->pieceIn == EmptySquare || cl->pieceIn == board[rf][ff]) && + if ((cl->pieceIn == EmptySquare || cl->pieceIn == board[rf][ff] + || PieceToChar(board[rf][ff]) == '~' + && cl->pieceIn == (ChessSquare)(DEMOTED board[rf][ff]) + ) && (cl->rfIn == -1 || cl->rfIn == rf) && (cl->ffIn == -1 || cl->ffIn == ff) && (cl->rtIn == -1 || cl->rtIn == rt) && @@ -1124,6 +1191,11 @@ void Disambiguate(board, flags, epfile, closure) closure->count = 0; closure->rf = closure->ff = closure->rt = closure->ft = 0; closure->kind = ImpossibleMove; + if (appData.debugMode) { + fprintf(debugFP, "Disambiguate in: %d(%d,%d)-(%d,%d) = %d (%c)\n", + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn, + closure->promoCharIn, closure->promoCharIn >= ' ' ? closure->promoCharIn : '-'); + } GenLegal(board, flags, epfile, initialRights, DisambiguateCallback, (VOIDSTAR) closure); if (closure->count == 0) { /* See if it's an illegal move due to check */ @@ -1132,31 +1204,39 @@ void Disambiguate(board, flags, epfile, closure) (VOIDSTAR) closure); if (closure->count == 0) { /* No, it's not even that */ + if (appData.debugMode) { int i, j; + for(i=BOARD_HEIGHT-1; i>=0; i--) { + for(j=0; jpieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); - } if(gameInfo.variant == VariantShogi) { /* [HGM] Shogi promotions. '=' means defer */ if(closure->rfIn != DROP_RANK && closure->kind == NormalMove) { ChessSquare piece = closure->piece; - +#if 0 if (appData.debugMode) { fprintf(debugFP, "Disambiguate A: %d(%d,%d)-(%d,%d) = %d (%c)\n", - closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn, + closure->promoCharIn,closure->promoCharIn); } +#endif if(c != NULLCHAR && c != 'x' && c != '+' && c != '=' && ToUpper(PieceToChar(PROMOTED piece)) != ToUpper(c) ) closure->kind = IllegalMove; else if(flags & F_WHITE_ON_MOVE) { +#if 0 if (appData.debugMode) { fprintf(debugFP, "Disambiguate B: %d(%d,%d)-(%d,%d) = %d (%c)\n", - closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn, + closure->promoCharIn,closure->promoCharIn); } +#endif if( (int) piece < (int) WhiteWazir && (closure->rf > BOARD_HEIGHT-4 || closure->rt > BOARD_HEIGHT-4) ) { if( (piece == WhitePawn || piece == WhiteQueen) && closure->rt > BOARD_HEIGHT-2 || @@ -1190,10 +1270,13 @@ void Disambiguate(board, flags, epfile, closure) closure->kind = IllegalMove; } } +#if 0 if (appData.debugMode) { fprintf(debugFP, "Disambiguate C: %d(%d,%d)-(%d,%d) = %d (%c)\n", - closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn,closure->promoCharIn,closure->promoCharIn); + closure->pieceIn,closure->ffIn,closure->rfIn,closure->ftIn,closure->rtIn, + closure->promoCharIn,closure->promoCharIn); } +#endif /* [HGM] returns 'q' for optional promotion, 'n' for mandatory */ if(closure->promoCharIn != '=') closure->promoChar = ToLower(PieceToChar(PromoPiece(closure->kind))); @@ -1214,7 +1297,8 @@ void Disambiguate(board, flags, epfile, closure) closure->promoChar = closure->promoCharIn; if (appData.debugMode) { fprintf(debugFP, "Disambiguate out: %d(%d,%d)-(%d,%d) = %d (%c)\n", - closure->piece,closure->ff,closure->rf,closure->ft,closure->rt,closure->promoChar,closure->promoChar); + closure->piece,closure->ff,closure->rf,closure->ft,closure->rt,closure->promoChar, + closure->promoChar >= ' ' ? closure->promoChar:'-'); } } @@ -1245,7 +1329,10 @@ void CoordsToAlgebraicCallback(board, flags, kind, rf, ff, rt, ft, closure) (CoordsToAlgebraicClosure *) closure; if (rt == cl->rt && ft == cl->ft && - board[rf][ff] == cl->piece) { + (board[rf][ff] == cl->piece + || PieceToChar(board[rf][ff]) == '~' && + (ChessSquare) (DEMOTED board[rf][ff]) == cl->piece) + ) { if (rf == cl->rf) { if (ff == cl->ff) { cl->kind = kind; /* this is the move we want */ @@ -1275,7 +1362,7 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, { ChessSquare piece; ChessMove kind; - char *outp = out; + char *outp = out, c; CoordsToAlgebraicClosure cl; if (rf == DROP_RANK) { @@ -1287,20 +1374,18 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, *outp++ = rt + ONE; else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; } *outp = NULLCHAR; - AlphaRank(out, 5); return (flags & F_WHITE_ON_MOVE) ? WhiteDrop : BlackDrop; } if (promoChar == 'x') promoChar = NULLCHAR; piece = board[rf][ff]; + if(PieceToChar(piece)=='~') piece = (ChessSquare)(DEMOTED piece); if (appData.debugMode) - fprintf(debugFP, "CoordsToAlgebraic, piece=%d\n", (int)piece); + fprintf(debugFP, "CoordsToAlgebraic, piece=%d (%d,%d)-(%d,%d) %c\n", (int)piece,ff,rf,ft,rt,promoChar >= ' ' ? promoChar : '-'); switch (piece) { case WhitePawn: case BlackPawn: - if (appData.debugMode) - fprintf(debugFP, "CoordsToAlgebraic, Pawn\n"); kind = LegalityTest(board, flags, epfile, initialRights, rf, ff, rt, ft, promoChar); if (kind == IllegalMove && !(flags&F_IGNORE_CHECK)) { /* Keep short notation if move is illegal only because it @@ -1328,6 +1413,8 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, } /* Use promotion suffix style "=Q" */ *outp = NULLCHAR; + if (appData.debugMode) + fprintf(debugFP, "movetype=%d, promochar=%d=%c\n", (int)kind, promoChar, promoChar >= ' ' ? promoChar : '-'); if (promoChar != NULLCHAR) { if(gameInfo.variant == VariantShogi) { /* [HGM] ... but not in Shogi! */ @@ -1338,7 +1425,6 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, } *outp = NULLCHAR; } - AlphaRank(out, 10); return kind; @@ -1404,13 +1490,14 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, else "N1f3" or "N5xf7", else "Ng1f3" or "Ng5xf7". */ - if(PieceToChar(piece) == '.') { + c = PieceToChar(piece) ; + if( c == '~' || c == '+') { /* [HGM] print nonexistent piece as its demoted version */ piece = (ChessSquare) (DEMOTED piece); - if( gameInfo.variant == VariantShogi ) - *outp++ = '+'; } + if(c=='+') *outp++ = c; *outp++ = ToUpper(PieceToChar(piece)); + if (cl.file || (cl.either && !cl.rank)) { *outp++ = ff + AAA; } @@ -1465,12 +1552,15 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, } } } - AlphaRank(out, 10); return cl.kind; /* [HGM] Always long notation for fairies we don't know */ - case WhiteNightrider: - case BlackNightrider: + case WhiteFalcon: + case BlackFalcon: + case WhiteSilver: + case BlackSilver: + case WhiteLance: + case BlackLance: case WhiteGrasshopper: case BlackGrasshopper: case EmptySquare: @@ -1506,7 +1596,6 @@ ChessMove CoordsToAlgebraic(board, flags, epfile, } *outp = NULLCHAR; - AlphaRank(out, 0); return IllegalMove; }