Fix double-capture of royal pair
authorH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 30 Apr 2014 08:10:22 +0000 (10:10 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 30 Apr 2014 08:10:22 +0000 (10:10 +0200)
Kings could step in check if there was a Crown Prince, but there was
no allowance for the fact that this could expose both of them to
simultaneous capture by a Lion. So the search can visit nodes where there
is no royal, which did cause a cratch. This is now intercepted at the top
of Search, in the check test, which aborts the branch if there is no royal.
Except in tsume for the winning side. (Although this then might still
cause the crash, probably in eval.)

hachu.c

diff --git a/hachu.c b/hachu.c
index 641de3b..869a9b8 100644 (file)
--- a/hachu.c
+++ b/hachu.c
@@ -12,7 +12,7 @@
 \r
 #define VERSION "0.19"\r
 \r
-//define PATH level==0/* || path[0] == 0x1103a &&  (level==1 || path[1] == 0x6f0f6 && (level == 2 /*|| path[2] == 0x8710f && (level == 3 /*|| path[3] == 0x3e865 && (level == 4 || path[4] == 0x4b865 && (level == 5)))))*/\r
+//define PATH level==0 || path[0] == 0x590cb &&  (level==1 || path[1] == 0x4c0c9 && (level == 2 || path[2] == 0x8598ca && (level == 3 /*|| path[3] == 0x3e865 && (level == 4 || path[4] == 0x4b865 && (level == 5))*/)))\r
 #define PATH 0\r
 \r
 #define HASH\r
@@ -1787,8 +1787,10 @@ if(PATH) /*pboard(board),pmap(attacks, BLACK),*/printf("search(%d) {%d,%d} eval=
   // in-check test and TSUME filter\r
   {\r
     k = p[king=royal[stm]].pos;\r
-    if( k == ABSENT) k = p[king + 2].pos;\r
-    else if(p[king + 2].pos != ABSENT) k = ABSENT; // two kings is no king...\r
+    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
     if( k != ABSENT) { // check is possible\r
       if(!attacks[2*k + xstm]) {\r
        if(tsume && tsume & stm+1) {\r