Update man page
[fairymax.git] / fairymax.c
index ffa6ca8..3bd0c69 100644 (file)
@@ -149,7 +149,7 @@ D(k,q,l,e,E,z,n)        /* recursive minimax search, k=moving side, n=depth*/
 int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/\r
 {                       /* e=score, z=prev.dest; J,Z=hashkeys; return score*/\r
  int j,r,m,v,d,h,i,F,G,P,V,f=J,g=Z,C,s,flag,FF,*ps=sp,kk=S;\r
- signed char t,p,u,x,y,X,Y,H,B,gt;\r
+ signed char t,p,u,x,y,X,Y,H,B,gt,rg;\r
  struct _*a=A+(J+(k+S)*E&U);                   /* lookup pos. in hash table*/\r
  *sp++=0;\r
  q-=q<e;l-=l<=e;                               /* adj. window: delay bonus */\r
@@ -174,7 +174,7 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
     W(r=o[++j])                                /* loop over directions o[] */\r
     {A:                                        /* resume normal after best */\r
      flag=h?3:of[j];                           /* move modes (for fairies) */\r
-     y=x;F=FF=G=S;                             /* (x,y)=move, (F,G)=castl.R*/\r
+     y=x;F=FF=G=S;rg=flag>>10&3;               /* (x,y)=move, (F,G)=castl.R*/\r
      do{                                       /* y traverses ray, or:     */\r
       H=y=h?Y^h:y+r;                           /* sneak in prev. best move */\r
       if(flag&1<<8)H=y=(y&15)>13?y+BW:(y&15)>=BW?y-BW:y; /* cylinder board */\r
@@ -218,7 +218,7 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
         v+=e+i;V=m>q?m:q;                      /*** new eval & alpha    ****/\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|v>V?-D(16-k,-l,-V,-v,/*** futility, recursive eval. of reply */\r
                                      F,y&255,C):v;\r
@@ -231,8 +231,9 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
         if(z&S&&K-I)                           /* move pending: check legal*/\r
         {if(v+I&&x==K&y==L&gt==GT)             /*   if move found          */\r
          {Q=-e-i;O=F;LL=L;prom=gt;\r
-          if(b[y]-u&15)prom=b[y]-=PromPiece,   /* under-promotion, correct */\r
-                       Z+=PromPiece;           /*  piece & invalidate hash */\r
+          if(b[y]-u&15)prom=b[y]-=PromPiece,   /* (under-)promotion:       */\r
+           Q-=abs(w[prom&=15])-w[p]-(6*S>>sh), /*  correct piece & score & */\r
+                       Z+=PromPiece;           /*  invalidate hash         */\r
           a->D=99;a->V=0;                      /* lock game in hash as draw*/\r
           R-=i/FAC;                            /*** total captd material ***/\r
           Fifty = t|p<3?0:Fifty+1;\r
@@ -272,7 +273,7 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
         )t+=flag&4;                            /* fake capt. for nonsliding*/\r
       else if(flag&64)t=flag&128?0:t,flag&=63;else F=y; /* enable e.p.     */\r
       if(s&&flag&8)t=0,flag^=flag>>4&15;       /* hoppers go to next phase */\r
-      if(!(flag&S))                            /* zig-zag piece?           */\r
+      if(--rg<0&!(flag&S))                     /* zig-zag piece? (w. delay)*/\r
        r=v,flag^=flag>>4&15;                   /* alternate vector & mode  */\r
      }W(!t);                                   /* if not capt. continue ray*/\r
    }}\r
@@ -582,7 +583,7 @@ int main(int argc, char **argv)
                             printf("move ");\r
                             printf("%c%c%c%c",'a'+(K&15),'0'+BH-(K>>4),\r
                                           'a'+(L&15),'0'+BH-(L>>4));\r
-                           if(prom)printf("%c",piecename[prom&15]+'a'-1);\r
+                           if(prom)printf("%c",piecename[prom]+'a'-1);\r
                             printf("\n");\r
 \r
                             /* time-control accounting */\r
@@ -808,7 +809,7 @@ int main(int argc, char **argv)
                        continue;\r
                }\r
                 if (!strcmp(command, "edit")) {\r
-                        int color = WHITE, p;\r
+                        int color = WHITE, p, r;\r
 \r
                         while(fgets(line, 256, stdin)) {\r
                                 m = line[0];\r
@@ -835,16 +836,16 @@ int main(int argc, char **argv)
                                     } else\r
                                     if(line[1] >= 'a' && line[1] <= 'a'+BW-1\r
                                     && line[2] >= '1' && line[2] <= '0'+BH) {\r
-                                        m = line[1]-16*line[2]+799;\r
+                                        m = line[1]-16*line[2]+799; r = m & 0x70;\r
                                         switch(p)\r
                                         {\r
                                         case 1:\r
                                         case 2:\r
                                             if(color==WHITE)\r
-                                                 b[m]=(m&0x70)==0x60?1:33,\r
-                                                 Q+=w[1];\r
-                                            else b[m]=(m&0x70)==0x10?18:50,\r
-                                                 Q+=w[2];\r
+                                                 b[m]=r==0x10?161:r==0x20?97:r==0x60?1:33,\r
+                                                 Q+=w[1]+(r==0x10?S:r==0x20?64:0);\r
+                                            else b[m]=r==0x60?178:r==0x50?114:r==0x10?18:50,\r
+                                                 Q+=w[2]+(r==0x60?S:r==0x50?64:0);\r
                                             break;\r
                                         default:\r
                                             b[m]=p+color+32; // assume non-virgin\r