Fix spurious result claims in Spartan Chess
authorH.G. Muller <h.g.muller@hccnet.nl>
Tue, 12 Feb 2013 08:43:20 +0000 (09:43 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Tue, 12 Feb 2013 11:18:58 +0000 (12:18 +0100)
Fairy-Max sometimes sees phantom mates, where evasion is possible through
promotion to royalty. The possibility for this is now detected based on
presence of expendable royalty in the list of participating pieces,
and this is used to suppress loss claims. (Checking if promotion is
indeed possible is limited to presence of 2nd-rank Pawn.)
 In addition promotion to royalty is now rejected as illegal in variants
without expendable royalty.

fairymax.c

index cf62466..792ceeb 100644 (file)
@@ -104,7 +104,7 @@ int Cambodian;
 int Threshold = 800;\r
 int Score;\r
 int makruk;\r
-int prom, pm, gating;\r
+int prom, pm, gating, succession;\r
 char piecename[32], piecetype[32], blacktype[32];\r
 char selectedFairy[80];\r
 char *inifile = INI_FILE;\r
@@ -364,8 +364,12 @@ int PrintResult(int s)
         if(cnt==-I+1) {\r
                 if (s == WHITE)\r
                         printf("0-1 {Black mates}\n");\r
-                else\r
+                else {\r
+                        if(succession) { // suppress loss claim if black might be able to replace its King by promotion\r
+                            for(j=0;j<BW;j++)if((b[j+96]&31)==18)return 0;\r
+                        }\r
                         printf("1-0 {White mates}\n");\r
+                }\r
                 return 3;\r
         }\r
         if(Fifty >=100) {\r
@@ -472,7 +476,7 @@ void LoadGame(char *name)
         if(fscanf(f, "version 4.8(%c)", &c)!=1 || c != 'w')\r
         { printf("telluser incompatible fmax.ini file\n"); exit(0); }\r
 \r
-        gating = 0;\r
+        gating = succession = 0;\r
         if(name != NULL)\r
         {  /* search for game name in definition file */\r
            if(!strcmp(name, "makruk") && Cambodian) name = "cambodian"; else\r
@@ -507,6 +511,7 @@ void LoadGame(char *name)
             { od[++i]=j; centr[i] = c>='a';\r
               blacktype[c&31]=i; piecename[i]=c&31;\r
               if(piecetype[c&31]==0) piecetype[c&31]=i; // only first\r
+              succession |= w[i] < -4;         // expendable royalty; assume we can promote to it\r
             }\r
             j++; o[j]=0;\r
             /* printf("# c='%c' i=%d od[i]=%d j=%d (%3d,%8x)\n",c?c:' ',i,od[i],j,o[j-1],of[j-1]); /**/\r
@@ -874,6 +879,7 @@ int main(int argc, char **argv)
                 GT = (Side == WHITE ? piecetype : blacktype)[line[4]&31];\r
                 if(GT) PromPiece = (Side == WHITE ? 7 : 7+pm) - GT, GT |= 32 + Side;\r
                 {char *c=line; K=c[0]-16*c[1]+799;L=c[2]-16*c[3]+799; }\r
+                if(w[GT&15] == -1) L = S; // spoil move for promotion to King\r
                 if (m & line[1] != '@')\r
                         /* doesn't have move syntax */\r
                        printf("Error (unknown command): %s\n", command);\r