Use returned depth in hash table
[hachu.git] / hachu.c
diff --git a/hachu.c b/hachu.c
index a8828c5..f058616 100644 (file)
--- a/hachu.c
+++ b/hachu.c
@@ -820,6 +820,7 @@ SetUp(char *array, int var)
   char c, *q, name[3], prince = 0;\r
   PieceDesc *p1, *p2;\r
   last[WHITE] = 1; last[BLACK] = 0;\r
+  royal[WHITE] = royal[BLACK] = 0;\r
   for(i=0; ; i++) {\r
 //printf("next rank: %s\n", array);\r
     for(j = BW*i; ; j++) {\r
@@ -860,6 +861,9 @@ SetUp(char *array, int var)
     }\r
   }\r
  eos:\r
+  // add dummy Kings if not yet added (needed to set royal[] to valid value!)\r
+  if(!royal[WHITE]) p[AddPiece(WHITE, LookUp("K", V_CHU))].pos = ABSENT;\r
+  if(!royal[BLACK]) p[AddPiece(BLACK, LookUp("K", V_CHU))].pos = ABSENT;\r
   // add dummy Crown Princes if not yet added\r
   if(!(prince & WHITE+1)) p[AddPiece(WHITE, LookUp("CP", V_CHU))].pos = ABSENT;\r
   if(!(prince & BLACK+1)) p[AddPiece(BLACK, LookUp("CP", V_CHU))].pos = ABSENT;\r
@@ -1792,7 +1796,12 @@ if(PATH) /*pboard(board),pmap(attacks, BLACK),*/printf("search(%d) {%d,%d} eval=
     if( k == ABSENT) {\r
       if((k = p[king + 2].pos) == ABSENT && (!tsume || tsume & stm+1))\r
         return -INF;   // lose when no King (in tsume only for side to be mated)\r
-    } else if(p[king + 2].pos != ABSENT) k = ABSENT; // two kings is no king...\r
+    } else if(p[king + 2].pos != ABSENT) {\r
+      if(tsume && tsume & stm+1) {\r
+       retDep = 60; return INF; // we win when not in check\r
+      }\r
+      k = ABSENT; // two kings is no king...\r
+    }\r
     if( k != ABSENT) { // check is possible\r
       if(!attacks[2*k + xstm]) {\r
        if(tsume && tsume & stm+1) {\r
@@ -2018,6 +2027,7 @@ if(flag & depth >= 0) printf("%2d:%d found %d/%d %08x %s\n", depth, iterDep, cur
 \r
 if(flag & depth >= 0) printf("%2d:%d made %d/%d %s\n", depth, iterDep, curMove, msp, MoveToText(moveStack[curMove], 0));\r
       for(i=2; i<=cnt50; i+=2) if(repStack[level-i+200] == hashKeyH) {\r
+       retDep = iterDep;\r
        if(repDraws) { score = 0; goto repetition; }\r
        if(!allowRep) {\r
          moveStack[curMove] = 0;         // erase forbidden move\r
@@ -2137,7 +2147,7 @@ if(PATH) printf("%d:%2d:%d %3d %6x %-10s %6d %6d  (%d)\n", level, depth, iterDep
 #ifdef HASH\r
     // hash store\r
     hashTable[index].lock[hit]  = hashKeyH;\r
-    hashTable[index].depth[hit] = iterDep;\r
+    hashTable[index].depth[hit] = resDep;\r
     hashTable[index].score[hit] = bestScore;\r
     hashTable[index].flag[hit]  = (bestScore < beta) * H_UPPER;\r
     if(bestScore > alpha) {\r