Update man page
[fairymax.git] / fairymax.c
index 6f420ae..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
@@ -232,7 +232,7 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
         {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:       */\r
-           Q-=abs(w[prom&=15])-w[p]-6*S,       /*  correct piece & score & */\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
@@ -273,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