X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=fa41620624525080c8bb99497b8dc951af4dfee8;hb=f111a0eab598dd35c865985f85a93955f4fe5b3e;hp=978d8958651ef7dd4f23d996c5dc44efaee458b1;hpb=e9ab870ddf0840e4206da403934d97019d28e36b;p=xboard.git diff --git a/moves.c b/moves.c index 978d895..fa41620 100644 --- a/moves.c +++ b/moves.c @@ -1518,7 +1518,8 @@ if(appData.debugMode)fprintf(debugFP,"SHOGI promoChar = %c\n", promoChar ? promo ChessSquare piece = board[rf][ff]; if(piece < BlackPawn ? piece > WhiteMan : piece > BlackMan) return ImpossibleMove; // already promoted // should test if in zone, really - if(gameInfo.variant == VariantChuChess && (piece == WhiteKnight || piece == BlackKnight)) return !HasLion(board, flags); + if(gameInfo.variant == VariantChuChess && (piece == WhiteKnight || piece == BlackKnight) && HasLion(board, flags)) + return IllegalMove; if(PieceToChar(PROMOTED piece) == '+') return flags & F_WHITE_ON_MOVE ? WhitePromotion : BlackPromotion; } else if(promoChar == '=') cl.kind = IllegalMove; else // [HGM] shogi: no deferred promotion outside Shogi @@ -1526,11 +1527,13 @@ if(appData.debugMode)fprintf(debugFP,"SHOGI promoChar = %c\n", promoChar ? promo ChessSquare piece = CharToPiece(flags & F_WHITE_ON_MOVE ? ToUpper(promoChar) : ToLower(promoChar)); if(piece == EmptySquare) cl.kind = ImpossibleMove; // non-existing piece - if(gameInfo.variant == VariantSpartan && cl.kind == BlackPromotion ) { + if(gameInfo.variant == VariantChuChess && promoChar == 'l' && HasLion(board, flags)) { + cl.kind = IllegalMove; // no two Lions + } else if(gameInfo.variant == VariantSpartan && cl.kind == BlackPromotion ) { if(promoChar != PieceToChar(BlackKing)) { if(CheckTest(board, flags, rf, ff, rt, ft, FALSE)) cl.kind = IllegalMove; // [HGM] spartan: only promotion to King was possible if(piece == BlackLance) cl.kind = ImpossibleMove; - } else { // promotion to King allowed only if we do not haave two yet + } else { // promotion to King allowed only if we do not have two yet int r, f, kings = 0; for(r=0; rkind = IllegalMove; } else if (c == '+') { // '+' outside shogi, check if pieceToCharTable enabled it ChessSquare p = closure->piece; if(p > WhiteMan && p < BlackPawn || p > BlackMan || PieceToChar(PROMOTED p) != '+') closure->kind = ImpossibleMove; // used on non-promotable piece + else if(gameInfo.variant == VariantChuChess && HasLion(board, flags)) closure->kind = IllegalMove; } else if (c != NULLCHAR) closure->kind = IllegalMove; closure->promoChar = ToLower(c); // this can be NULLCHAR! Note we keep original promoChar even if illegal.