Implement option for using Okazaki rule
[hachu.git] / hachu.c
diff --git a/hachu.c b/hachu.c
index b39efbf..6d3e17f 100644 (file)
--- a/hachu.c
+++ b/hachu.c
@@ -140,7 +140,8 @@ typedef struct {
 } UndoInfo;\r
 \r
 char *array, fenArray[4000], startPos[4000], *reason, checkStack[300];\r
-int bWidth, bHeight, bsize, zone, currentVariant, chuFlag, tenFlag, chessFlag, repDraws, stalemate, tsume, pvCuts, allowRep, entryProm, pVal;\r
+int bWidth, bHeight, bsize, zone, currentVariant, chuFlag, tenFlag, chessFlag, repDraws, stalemate;\r
+int tsume, pvCuts, allowRep, entryProm, okazaki, pVal;\r
 int stm, xstm, hashKeyH=1, hashKeyL=1, framePtr, msp, nonCapts, rootEval, filling, promoDelta;\r
 int retMSP, retFirst, retDep, pvPtr, level, cnt50, mobilityScore;\r
 int ll, lr, ul, ur; // corner squares\r
@@ -1963,7 +1964,9 @@ MapFromScratch(attacks); // for as long as incremental update does not work.
          if(dist[tb.from-tb.to] != 1 && attacks[2*tb.to + stm] && p[tb.epVictim[0]].value <= 50)\r
            score = -INF;                           // our Lion is indeed made vulnerable and can be recaptured\r
        } else {                                    // other x Ln\r
-         if(promoSuppress & PROMOTE) score = -INF; // non-Lion captures Lion after opponent did same\r
+         if(promoSuppress & PROMOTE) {             // non-Lion captures Lion after opponent did same\r
+           if(!okazaki || attacks[2*tb.to + stm]) score = -INF;\r
+         }\r
          defer |= PROMOTE;                         // if we started, flag  he cannot do it in reply\r
        }\r
         if(score == -INF) {\r
@@ -2476,7 +2479,7 @@ printf("# SearchBestMove\n");
 printf("# s=%d\n", startTime);fflush(stdout);\r
 MapFromScratch(attacks);\r
   retMove = INVALID; repCnt = 0;\r
-  score = Search(-INF-1, INF+1, rootEval, maxDepth, 0, sup1, sup2, INF);\r
+  score = Search(-INF-1, INF+1, rootEval, maxDepth + QSdepth, 0, sup1, sup2, INF);\r
   *move = retMove;\r
   *ponderMove = pv[1];\r
 printf("# best=%s\n", MoveToText(pv[0],0));\r
@@ -2642,6 +2645,7 @@ pboard(board);
           printf("feature option=\"Full analysis PV -check 1\"\n"); // example of an engine-defined option\r
           printf("feature option=\"Allow repeats -check 0\"\n");\r
           printf("feature option=\"Promote on entry -check 0\"\n");\r
+          printf("feature option=\"Okazaki rule -check 0\"\n");\r
           printf("feature option=\"Resign -check 0\"\n");           // \r
           printf("feature option=\"Contempt -spin 0 -200 200\"\n"); // and another one\r
           printf("feature option=\"Tsume -combo no /// Sente mates /// Gote mates\"\n");\r
@@ -2653,6 +2657,7 @@ pboard(board);
           if(sscanf(inBuf+7, "Allow repeats=%d", &allowRep)  == 1) continue;\r
           if(sscanf(inBuf+7, "Resign=%d",   &resign)         == 1) continue;\r
           if(sscanf(inBuf+7, "Contempt=%d", &contemptFactor) == 1) continue;\r
+          if(sscanf(inBuf+7, "Okazaki rule=%d", &okazaki)    == 1) continue;\r
           if(sscanf(inBuf+7, "Promote on entry=%d", &entryProm) == 1) continue;\r
           if(sscanf(inBuf+7, "Tsume=%s", command) == 1) {\r
            if(!strcmp(command, "no"))    tsume = 0; else\r
@@ -2664,6 +2669,7 @@ pboard(board);
         }\r
         if(!strcmp(command, "sd"))      { sscanf(inBuf, "sd %d", &maxDepth);    continue; }\r
         if(!strcmp(command, "st"))      { sscanf(inBuf, "st %d", &timePerMove); continue; }\r
+\r
         if(!strcmp(command, "memory"))  { SetMemorySize(atoi(inBuf+7)); continue; }\r
         if(!strcmp(command, "ping"))    { printf("pong%s", inBuf+4); continue; }\r
     //  if(!strcmp(command, ""))        { sscanf(inBuf, " %d", &); continue; }\r