Let edit command switch to force mode
[fairymax.git] / fairymax.c
index 5b2e98a..3a89dd5 100644 (file)
@@ -18,7 +18,7 @@
      /*****************************************************************/\r
 \r
 #define MULTIPATH\r
-#define VERSION "4.8O"\r
+#define VERSION "4.8P"\r
 \r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -181,7 +181,8 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
       if(flag&1+!t)                            /* mode (capt/nonc) allowed?*/\r
       {if(t&&(t&16)==k)break;                  /* capture own              */\r
        i=w[t&15]+((t&192)>>sh);                /* value of capt. piece t   */\r
-       if(i<0&&(pl[t&31]<2||kk!=H&kk!=S||(kk=H,i=-i,0)))m=I,d=98;/* K capture, duple check */\r
+       if(i<0&&(pl[t&31]<2||                   /* K capture, (of last K),  */\r
+        t>>3&kk!=H&kk!=S||(kk=H,i=-i,0)))m=I,d=98;/* or duple check: cutoff*/\r
        if(m>=l&d>1)goto C;                     /* abort on fail high       */\r
        v=d-1?e:i-p;                            /*** MVV/LVA scoring if d=1**/\r
        if(d-!t>1)                              /*** all captures if d=2  ***/\r
@@ -365,19 +366,26 @@ InitEngine()
 \r
 InitGame()\r
 {\r
- int i,j;\r
+ int i,j,k=0;\r
 \r
+ Side = WHITE; Q=0; O=S;\r
+ Fifty = 0; R = 0;\r
  for(i=0;i<16*BH;i++)b[i]=0;\r
  for(i=0;i<32;i++)pl[i]=0;\r
  K=BW;W(K--)\r
  {b[K]=oo[K+16]+16;b[K+112]=oo[K];b[K+16]=18;b[K+96]=1; /* initial board setup*/\r
   pl[oo[K+16]+16]++;pl[oo[K]]++;pl[18]++;pl[1]++;\r
+  if(w[oo[K+16]+16] == -1)pl[oo[K+16]+16]=1;\r
+  if(w[oo[K]] == -1)pl[oo[K]]=1;\r
   L=8;W(L--)b[16*L+K+257]=(K-BW/2)*(K-BW/2)+(L-3.5)*(L-3.5); /* center-pts table   */\r
  }                                                   /*(in unused half b[])*/\r
- Side = WHITE; Q=0; O=S;\r
- Fifty = 0; R = 0;\r
- for(i=0; i<BW; i++) if(i!=3) R += (w[oo[i]]/FAC) + (w[oo[i+16]]/FAC);\r
- UnderProm = -1; pl[WHITE] = pl[BLACK] = 2*BW;\r
+ for(i=0; i<BW; i++) {\r
+  R += abs(w[oo[i]])/FAC + abs(w[oo[i+16]])/FAC;\r
+  Q += abs(w[oo[i]]) - abs(w[oo[i+16]]) + w[1] - w[2];\r
+  if(w[oo[i]] < 0) k = w[oo[i]];\r
+ }\r
+ R -= 2*(-k/FAC);\r
+ UnderProm = -1; pl[WHITE] = pl[BLACK] = 2*BW; \r
  pm = !pl[BLACK+7] && pl[BLACK+9] && pl[WHITE+7] ? 2 : 0; // Unlike white, black has no 'Q', so promote to 9, which he does have.\r
 }\r
 \r
@@ -432,7 +440,7 @@ void PrintOptions()
                                          \r
 int LoadGame(char *name)\r
 {\r
-        int i, j, count=0; char c, buf[80];\r
+        int i, j, ptc, count=0; char c, buf[80], pieceToChar[80];\r
         static int currentVariant;\r
         FILE *f;\r
 \r
@@ -447,7 +455,7 @@ int LoadGame(char *name)
         if(name != NULL)\r
         {  /* search for game name in definition file */\r
            if(!strcmp(name, "fairy")) name = selectedFairy;\r
-           while(fscanf(f, "Game: %s", buf)!=1 || strcmp(name, buf) ) {\r
+           while((ptc=fscanf(f, "Game: %s # %s", buf, pieceToChar))==0 || strcmp(name, buf) ) {\r
                while((c = fgetc(f)) != EOF && c != '\n');\r
                count++;\r
                if(c == EOF) {\r
@@ -485,6 +493,14 @@ int 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
+            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
+            for(i=0; i<BW; i++) printf("%c", piecename[1]+'@'); printf("/");\r
+            for(i=0; i<BW; i++) printf("%c", piecename[oo[i]]+'@'); printf(" w KQkq - 0 1\n");\r
+        }\r
 }\r
 \r
 int main(int argc, char **argv)\r
@@ -812,6 +828,7 @@ int main(int argc, char **argv)
                                             break;\r
                                         }\r
                                         pl[BLACK+WHITE-color]++;pl[p+color]++;\r
+                                        if(w[p+color] == -1)pl[p+color]=1; // fake we have one if value = -1, to thwart extinction condition\r
                                         continue;\r
                                 }\r
                         }\r
@@ -821,6 +838,7 @@ int main(int argc, char **argv)
                        setupPosition[128] = Side;\r
                        setupPosition[129] = R;\r
                        for(i=0; i<32; i++) setupPosition[i+130] = pl[i];\r
+                       Computer = EMPTY; // after edit: force mode!\r
                        continue;\r
                }\r
                 /* command not recognized, assume input move */\r