X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=bf5ee28d2d9744c9aa45e4e1bc96471ffd2977e0;hb=4aed6e1fe3f9c75dbb37ab41e81aed204bba602f;hp=4d45196351ab691f3f1409ce6e1f119863d7f0f3;hpb=cb14acbc3b1ae54cb4465aa1939f71e28f2b2e4b;p=xboard.git diff --git a/moves.c b/moves.c index 4d45196..bf5ee28 100644 --- a/moves.c +++ b/moves.c @@ -382,7 +382,7 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, int rf, ff; int i, j, d, s, fs, rs, rt, ft, m; int epfile = (signed char)board[EP_STATUS]; // [HGM] gamestate: extract ep status from board - int promoRank = gameInfo.variant == VariantMakruk || gameInfo.variant == VariantGrand ? 3 : 1; + int promoRank = gameInfo.variant == VariantMakruk || gameInfo.variant == VariantGrand || gameInfo.variant == VariantChuChess ? 3 : 1; for (rf = 0; rf < BOARD_HEIGHT; rf++) for (ff = BOARD_LEFT; ff < BOARD_RGHT; ff++) { @@ -672,6 +672,7 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, /* Make Dragon-Horse also do Dababba moves outside Shogi, for better disambiguation in variant Fairy */ case WhiteCardinal: case BlackCardinal: + if(gameInfo.variant == VariantChuChess) goto DragonHorse; for (d = 0; d <= 1; d++) // Dababba moves that Rook cannot do for (s = -2; s <= 2; s += 4) { rt = rf + s * d; @@ -686,6 +687,7 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, case SHOGI BlackCardinal: case SHOGI WhitePCardinal: case SHOGI BlackPCardinal: + DragonHorse: Bishop(board, flags, rf, ff, callback, closure); Wazir(board, flags, rf, ff, callback, closure); break; @@ -735,6 +737,7 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, /* Make Dragon-King Dababba & Rook-like outside Shogi, for better disambiguation in variant Fairy */ case WhiteDragon: case BlackDragon: + if(gameInfo.variant == VariantChuChess) goto DragonKing; for (d = 0; d <= 1; d++) // Dababba moves that Rook cannot do for (s = -2; s <= 2; s += 4) { rt = rf + s * d; @@ -751,6 +754,7 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, case SHOGI BlackDragon: case SHOGI WhitePDragon: case SHOGI BlackPDragon: + DragonKing: Rook(board, flags, rf, ff, callback, closure); Ferz(board, flags, rf, ff, callback, closure); break; @@ -1370,6 +1374,16 @@ CheckTest (Board board, int flags, int rf, int ff, int rt, int ft, int enPassant return cl.fking < BOARD_RGHT ? cl.check : 1000; // [HGM] atomic: return 1000 if we have no king } +int +HasLion (Board board, int flags) +{ + int lion = F_WHITE_ON_MOVE & flags ? WhiteLion : BlackLion; + int r, f; + for(r=0; r 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(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 if (cl.kind == WhitePromotion || cl.kind == BlackPromotion) { ChessSquare piece = CharToPiece(flags & F_WHITE_ON_MOVE ? ToUpper(promoChar) : ToLower(promoChar));