Fix printing of e.p. captures
authorH.G. Muller <h.g.muller@hccnet.nl>
Tue, 22 Oct 2013 17:41:35 +0000 (19:41 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Tue, 22 Oct 2013 17:41:35 +0000 (19:41 +0200)
Do not print e.p. captures as to-leg moves, but just as the overall move.
This is what GUIs expect, the capture is implied.

hachu.c

diff --git a/hachu.c b/hachu.c
index 3367f3c..e660aa9 100644 (file)
--- a/hachu.c
+++ b/hachu.c
@@ -1841,6 +1841,12 @@ if(PATH) printf("%d:%2d:%2d msp=%d\n",level,depth,iterDep,msp);
 if(PATH) printf("captures on %d generated, msp=%d, group=%d, threshold=%d\n", nextVictim, msp, group, threshold);\r
              goto extractMove; // in auto-fail phase, only search if they might auto-fail-hi\r
            }\r
+if(PATH) printf("# autofail=%d\n", autoFail);\r
+           if(autoFail) { // non-captures cannot auto-fail; flush queued captures first\r
+if(PATH) printf("# autofail end (%d-%d)\n", firstMove, msp);\r
+             autoFail = 0; curMove = firstMove - 1; continue; // release stashed moves for search\r
+           }\r
+           phase = 4; // out of victims: all captures generated\r
            if(chessFlag && promoSuppress != ABSENT) { // e.p. rights. Create e.p. captures as Lion moves\r
                int n = board[promoSuppress-1], old = msp; // a-side neighbor of pushed pawn\r
                if( n != EMPTY && (n&TYPE) == stm && p[n].value == 80 ) NewCapture(promoSuppress-1, SPECIAL + 20 - 4*stm, 0);\r
@@ -1848,12 +1854,6 @@ if(PATH) printf("captures on %d generated, msp=%d, group=%d, threshold=%d\n", ne
                if( n != EMPTY && (n&TYPE) == stm && p[n].value == 80 ) NewCapture(promoSuppress+1, SPECIAL + 52 - 4*stm, 0);\r
                if(msp != old) goto extractMove; // one or more e.p. capture were generated\r
            }\r
-if(PATH) printf("# autofail=%d\n", autoFail);\r
-           if(autoFail) { // non-captures cannot auto-fail; flush queued captures first\r
-if(PATH) printf("# autofail end (%d-%d)\n", firstMove, msp);\r
-             autoFail = 0; curMove = firstMove - 1; continue; // release stashed moves for search\r
-           }\r
-           phase = 4; // out of victims: all captures generated\r
          case 4: // dubious captures\r
 #if 0\r
            while( dubious < framePtr + 250 ) // add dubious captures back to move stack\r
@@ -2591,9 +2591,13 @@ pboard(board);
             engineSide = NONE;          // so stop playing\r
             PrintResult(stm, score);\r
           } else {\r
+            MOVE f, pMove = move;\r
+            if((move & SQUARE) >= SPECIAL && p[board[f = move>>SQLEN & SQUARE]].value == 80) { // e.p. capture\r
+              pMove = move & ~SQUARE | f + toList[(move & SQUARE) - SPECIAL]; // print as a single move\r
+            }\r
             stm = MakeMove2(stm, move);  // assumes MakeMove returns new side to move\r
             gameMove[moveNr++] = move;   // remember game\r
-            printf("move %s\n", MoveToText(move, 1));\r
+            printf("move %s\n", MoveToText(pMove, 1));\r
             listEnd = 0;\r
             continue;                    // go check if we should ponder\r
           }\r