Send parent variant with setup command
[fairymax.git] / fairymax.c
index b236e4d..46b3890 100644 (file)
@@ -163,7 +163,7 @@ int k,q,l,e,ev,E,z,n;    /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
    (K=X,L=Y&~S,Score=m,d=3)))                  /* time's up: go do best    */\r
  {x=B=X;                                       /* start scan at prev. best */\r
   h=Y&S;                                       /* request try noncastl. 1st*/\r
-  P=d>2&&l+I?D(16-k,-l,1-l,-e,-ev,2*S,2*S,d-3):I;  /* search null move     */\r
+  P=n>2&d>1&&l+I?D(16-k,-l,1-l,-e,-ev,2*S,2*S,d-3):I;  /* search null move */\r
   m=-P<l|R<5?d-2?-I:ev:-P;  /*** prune if > beta  unconsidered:static eval */\r
   SHAMAX( if(pl[k]<=1&pl[16-k]>1)m=I-1; )      /* bare king loses          */\r
   N++;                                         /* node count (for timing)  */\r
@@ -219,7 +219,7 @@ int k,q,l,e,ev,E,z,n;    /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
         re=v>>Fac(v>>15&16^k);  /* Reduce eval if drawish for leading side */\r
         if(z&S)V=m-margin>q?m-margin:q;        /* multiPV                  */\r
         C=d-1-(d>5&p>2&!t&!h);                 /* nw depth, reduce non-cpt.*/\r
-        C=R<EG|P-I|d<3||t&&p-3?C:d;            /* extend 1 ply if in-check */\r
+        C=R<EG|P-I|d<3||t&&w[p]>0?C:d;         /* extend 1 ply if in-check */\r
         do\r
          s=C>2|re>V?-D(16-k,-l,-V,/*** futility, recursive eval. of reply */\r
                                   -v,-re,F,y&255,C):re;\r
@@ -300,7 +300,7 @@ Fac(int k)
    h=pl[k]-pl[17-k]-pl[18-k];                  /* his pieces (incl. King)  */\r
    if(h<2)r=0;                                 /* bare K easy even w.o. P  */\r
    j=h-n;                                      /* defenders after sac for P*/\r
-   if(j<3&&j--){                               /* can sac, <= 1 piece left */\r
+   if(j<3&&j-->0){                             /* can sac, <= 1 piece left */\r
     i=18-k;W(!pl[++i]);                        /* get lowest piece         */\r
     e=abs(w[i--])*n;                           /* sac for Pawn (if any)    */\r
     W(h>1)h-=pl[++i],e-=pl[i]*w[i];            /* total value his remaining*/\r
@@ -491,7 +491,7 @@ void PrintOptions()
                                          \r
 void LoadGame(char *name)\r
 {\r
-        int i, j, ptc, count=0; char c, buf[80], pieceToChar[80];\r
+        int i, j, ptc, count=0; char c, buf[80], pieceToChar[80], parent[80];\r
         static int currentVariant;\r
         FILE *f;\r
 \r
@@ -509,7 +509,7 @@ void LoadGame(char *name)
            if(!strcmp(name, "makruk") && Cambodian) name = "cambodian"; else\r
            if(!strcmp(name, "fairy")) name = selectedFairy;\r
            gating = !strcmp(name, "seirawan");\r
-           while((ptc=fscanf(f, "Game: %s # %s", buf, pieceToChar))==0 || strcmp(name, buf) ) {\r
+           while((ptc=fscanf(f, "Game: %s # %s %s", buf, pieceToChar, parent))==0 || strcmp(name, buf) ) {\r
                while((c = fgetc(f)) != EOF && c != '\n');\r
                count++;\r
                if(c == EOF) {\r
@@ -552,8 +552,9 @@ void LoadGame(char *name)
         fclose(f);\r
        sh = w[7] < 250 ? 3 : 0;\r
        makruk = w[7]==181 ? 64 : 0; // w[7] is used as kludge to enable makruk promotions\r
-        if(name == selectedFairy) {\r
-            printf(ptc == 1 ? "setup " : "setup (%s) ", pieceToChar); // setup board in GUI\r
+        if(ptc > 1) { // setup board in GUI, by sending it pieceToCharTable and FEN\r
+            if(ptc == 2) printf("setup (%s) ", pieceToChar);\r
+            else printf("setup (%s) %dx%d+0_%s", pieceToChar, BW, BH, parent);\r
             for(i=0; i<BW; i++) printf("%c", piecename[oo[i+16]]+'`'); printf("/");\r
             for(i=0; i<BW; i++) printf("%c", piecename[2]+'`'); printf("/");\r
             for(i=2; i<BH-2; i++) printf("%d/", BW);\r
@@ -773,7 +774,7 @@ int main(int argc, char **argv)
                        if(sscanf(line+7, "Ini File=%s", filename) == 1) {\r
                                inifile = filename; continue;\r
                        }\r
-                       if(sscanf(line+7, "Clear Hash%c", &c) == 1) for(i=0; i<=U; i++) A->K = 0;\r
+                       if(sscanf(line+7, "Clear Hash%c", &c) == 1) for(i=0; i<=U; i++) A[i].K = 0;\r
                        if(sscanf(line+7, "MultiVariation Margin=%d", &margin) == 1) continue;\r
                        if(sscanf(line+7, "Variant fairy selects=%s", selectedFairy+6) == 1) continue;\r
                        if(sscanf(line+7, "Cambodian Makruk rules=%d", &Cambodian) == 1) continue;\r