X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=7ffe59df8517cb72390671185ed9cfc713c1c1c5;hb=e6e38912837a4fe2464356408d10dee950b3121c;hp=fa41620624525080c8bb99497b8dc951af4dfee8;hpb=f111a0eab598dd35c865985f85a93955f4fe5b3e;p=xboard.git diff --git a/moves.c b/moves.c index fa41620..7ffe59d 100644 --- a/moves.c +++ b/moves.c @@ -5,7 +5,7 @@ * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, - * 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. + * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * @@ -1224,6 +1224,7 @@ GenLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, Ches if(ff <= BOARD_LEFT+2) { left = ff+1; right = BOARD_LEFT+3; } for(k=left; k<=right && ft != NoRights; k++) /* first test if blocked */ if(k != ft && board[0][k] != EmptySquare) ft = NoRights; + if(ft == 0 && ff != 1 && board[0][1] != EmptySquare) ft = NoRights; /* Rook can be blocked on b1 */ if(ff > BOARD_LEFT+2) for(k=left+1; k<=right && ft != NoRights; k++) /* then if not checked */ if(!ignoreCheck && CheckTest(board, flags, 0, ff, 0, k, FALSE)) ft = NoRights; @@ -1250,6 +1251,7 @@ GenLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, Ches if(ff <= BOARD_LEFT+2) { left = ff+1; right = BOARD_LEFT+3; } for(k=left; k<=right && ft != NoRights; k++) /* first test if blocked */ if(k != ft && board[BOARD_HEIGHT-1][k] != EmptySquare) ft = NoRights; + if(ft == 0 && ff != 1 && board[BOARD_HEIGHT-1][1] != EmptySquare) ft = NoRights; /* Rook can be blocked on b8 */ if(ff > BOARD_LEFT+2) for(k=left+1; k<=right && ft != NoRights; k++) /* then if not checked */ if(!ignoreCheck && CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, k, FALSE)) ft = NoRights; @@ -1310,6 +1312,15 @@ CheckTest (Board board, int flags, int rf, int ff, int rt, int ft, int enPassant king = flags & F_WHITE_ON_MOVE ? WhiteWazir : BlackWazir; if(gameInfo.variant == VariantKnightmate) king = flags & F_WHITE_ON_MOVE ? WhiteUnicorn : BlackUnicorn; + if(gameInfo.variant == VariantChu) { // strictly speaking this is not needed, as Chu officially has no check + int r, f, k = king, royals=0, prince = flags & F_WHITE_ON_MOVE ? WhiteMonarch : BlackMonarch; + for(r=0; r 1) return FALSE; // no check if we have two royals (ignores double captureby Lion!) + king = board[r][f]; // remember hich one we had + } + } + } if (rt >= 0) { if (enPassant) { @@ -1618,7 +1629,7 @@ MateTest (Board board, int flags) else if(gameInfo.variant == VariantGiveaway) return MT_STEALMATE; // no check exists, stalemated = win return inCheck ? MT_CHECKMATE - : (gameInfo.variant == VariantXiangqi || gameInfo.variant == VariantShatranj || gameInfo.variant == VariantShogi) ? + : (gameInfo.variant == VariantXiangqi || gameInfo.variant == VariantShatranj || IS_SHOGI(gameInfo.variant)) ? MT_STAINMATE : MT_STALEMATE; } }