Extend mate test to drop games
authorH.G. Muller <h.g.muller@hccnet.nl>
Thu, 16 Sep 2010 16:58:37 +0000 (18:58 +0200)
committerArun Persaud <arun@nubati.net>
Fri, 17 Sep 2010 03:47:14 +0000 (20:47 -0700)
MateTest() in case of no legal moves now also looks if there are legal
drops that can resolve the check. This provides reliable mate testing in
Crazyhouse and Shogi, so these are now made subject to adjudications too.

backend.c
moves.c

index 12cef35..d539198 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -6666,8 +6666,7 @@ Adjudicate(ChessProgramState *cps)
        ChessProgramState *engineOpponent = (gameMode == TwoMachinesPlay ? cps->other : (cps ? NULL : &first));
        Boolean canAdjudicate = !appData.icsActive;
 
        ChessProgramState *engineOpponent = (gameMode == TwoMachinesPlay ? cps->other : (cps ? NULL : &first));
        Boolean canAdjudicate = !appData.icsActive;
 
-       // most tests only when we understand the game, i.e. legality-checking on, and (for the time being) no piece drops
-       if(gameInfo.holdingsSize == 0 || gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) {
+       // most tests only when we understand the game, i.e. legality-checking on
            if( appData.testLegality )
            {   /* [HGM] Some more adjudications for obstinate engines */
                int nrW, nrB, bishopColor, staleW, staleB, nr[EmptySquare+1], i;
            if( appData.testLegality )
            {   /* [HGM] Some more adjudications for obstinate engines */
                int nrW, nrB, bishopColor, staleW, staleB, nr[EmptySquare+1], i;
@@ -6819,7 +6818,6 @@ Adjudicate(ChessProgramState *cps)
                      }
                 } else moveCount = 6;
            }
                      }
                 } else moveCount = 6;
            }
-       }
          
        if (appData.debugMode) { int i;
            fprintf(debugFP, "repeat test fmm=%d bmm=%d ep=%d, reps=%d\n",
          
        if (appData.debugMode) { int i;
            fprintf(debugFP, "repeat test fmm=%d bmm=%d ep=%d, reps=%d\n",
diff --git a/moves.c b/moves.c
index f4f33b2..3e58f42 100644 (file)
--- a/moves.c
+++ b/moves.c
@@ -1219,6 +1219,15 @@ int MateTest(board, flags)
     if (cl.count > 0) {
        return inCheck ? MT_CHECK : MT_NONE;
     } else {
     if (cl.count > 0) {
        return inCheck ? MT_CHECK : MT_NONE;
     } else {
+        if(gameInfo.holdingsWidth && gameInfo.variant != VariantSuper || gameInfo.variant != VariantGreat) { // drop game
+            int r, f, n, holdings = flags & F_WHITE_ON_MOVE ? BOARD_WIDTH-1 : 0;
+            for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++) if(board[r][f] == EmptySquare) // all empty squares
+                for(n=0; n<BOARD_HEIGHT; n++) // all pieces in hand
+                    if(board[n][holdings] != EmptySquare) {
+                        int moveType = LegalDrop(board, flags, board[n][holdings], r, f);
+                        if(moveType == WhiteDrop || moveType == BlackDrop) return MT_CHECK; // we can resolve check by legal drop
+                    }
+        }
        if(gameInfo.variant == VariantSuicide) // [HGM] losers: always stalemate, since no check, but result varies
                return myPieces == hisPieces ? MT_STALEMATE :
                                        myPieces > hisPieces ? MT_STAINMATE : MT_STEALMATE;
        if(gameInfo.variant == VariantSuicide) // [HGM] losers: always stalemate, since no check, but result varies
                return myPieces == hisPieces ? MT_STALEMATE :
                                        myPieces > hisPieces ? MT_STAINMATE : MT_STEALMATE;