Convert to DOS line ends
[fairymax.git] / fairymax.c
index d02f86a..2c16397 100644 (file)
@@ -101,7 +101,7 @@ char *inifile = INI_FILE;
 int Ticks, tlim, Setup, SetupQ;\r
 \r
 int GameHistory[1024];\r
-char HistoryBoards[1024][STATE], setupPosition[131];\r
+char HistoryBoards[1024][STATE], setupPosition[162];\r
 int GamePtr, HistPtr;\r
 \r
 #define W while\r
@@ -119,7 +119,7 @@ oo[32],                                        /* initial piece setup      */
 of[256],\r
 od[16];                                        /* 1st dir. in o[] per piece*/\r
 \r
-signed char L,pl[17],\r
+signed char L,pl[32],\r
 b[513],                                        /* board: 16x8+dummy, + PST */\r
 T[4104],                                       /* hash translation table   */\r
 centr[32],\r
@@ -137,7 +137,7 @@ pboard()
 D(k,q,l,e,E,z,n)        /* recursive minimax search, k=moving side, n=depth*/\r
 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;\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;\r
  struct _*a=A+(J+(k+S)*E&U-1);                 /* lookup pos. in hash table*/\r
  *sp++=0;\r
@@ -181,13 +181,14 @@ 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)m=I,d=98;                        /* K capture                */\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(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
        {v=centr[p]?b[x+257]-b[y+257]:0;        /* center positional pts.   */\r
         if(!(G&S))b[FF]=b[G],v+=50;            /* castling: put R & score  */\r
         b[G]=b[H]=b[x]=0;b[y]=u|32;            /* do move, set non-virgin  */\r
+        pl[t&31]-=!!t;                         /* updat victim piece count */\r
         v-=w[p]>0|R<EG?0:20;                   /*** freeze K in mid-game ***/\r
         if(p<3)                                /* pawns:                   */\r
         {v-=9*((x-2&M||b[x-2]-u)+              /* structure, undefended    */\r
@@ -227,7 +228,7 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
          v=m;                                  /* (prevent fail-lows on    */\r
         }                                      /*   K-capt. replies)       */\r
         J=f;Z=g;\r
-        SHAMAX( pl[k]+=!!t; )\r
+        SHAMAX( pl[k]+=!!t; ) pl[t&31]+=!!t;\r
         b[G]=b[FF];b[FF]=b[y]=0;b[x]=u;b[H]=t; /* undo move,G can be dummy */\r
        }                                       /*          if non-castling */\r
        if(z&S&&Post&K==I&d>2&v>V&v<l){int *p=ps;char X,Y;\r
@@ -237,7 +238,7 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
         while(*p){X=*p>>8;Y=*p++;\r
         printf(" %c%c%c%c",'a'+(X&15),'8'-(X>>4),'a'+(Y&15),'8'-(Y>>4&7));}\r
         printf("\n");fflush(stdout);\r
-       }
+       }\r
        if(v>m)                                 /* new best, update max,best*/\r
         m=v,X=x,Y=y|S&F;                       /* mark non-double with S   */\r
        if(h){h=0;goto A;}                      /* redo after doing old best*/\r
@@ -248,7 +249,7 @@ int k,q,l,e,E,z,n;      /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/
          ((b[G=r<0?x&~15:BW-1|x&112]^32)<33    /* no virgin R in corner G, */\r
          ||b[G^1]|b[G^2]|b[FF=y+v-r])          /* no 2 empty sq. next to R */\r
         )t+=flag&4;                            /* fake capt. for nonsliding*/\r
-      else F=y;                                /* enable e.p.              */\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
        r=v,flag^=flag>>4&15;                   /* alternate vector & mode  */\r
@@ -367,8 +368,10 @@ InitGame()
  int i,j;\r
 \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
   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
@@ -735,9 +738,9 @@ int main(int argc, char **argv)
                         InitGame();\r
                        if(Setup) {\r
                            for(i=0; i<128; i++) b[i] = setupPosition[i];\r
+                           for(i=0; i<32; i++) pl[i] = setupPosition[i+130];\r
                            Side = setupPosition[128]; Q = SetupQ;\r
-                           pl[WHITE] = setupPosition[129];\r
-                           pl[BLACK] = setupPosition[130];\r
+                           R = setupPosition[129];\r
                        }\r
                        for(i=0; i<=U; i++) A[i].D = A[i].K = 0; // clear hash table\r
                         for(nr=0; nr<GamePtr; nr++) {\r
@@ -769,6 +772,7 @@ int main(int argc, char **argv)
                                 if(m=='.') break;\r
                                 if(m=='#') {\r
                                         for(i=0; i<128; i++) b[i]=0;\r
+                                        for(i=0; i<32; i++) pl[i]=0;\r
                                         Q=0; R=0; O=S;\r
                                         pl[WHITE]=pl[BLACK]=0;\r
                                         continue;\r
@@ -794,17 +798,19 @@ int main(int argc, char **argv)
                                             break;\r
                                         default:\r
                                             b[m]=p+color+32; // assume non-virgin\r
-                                            if(w[p]<0) { // Royal piece on original square: virgin
+                                            if(w[p]<0) { // Royal piece on original square: virgin\r
                                                if(color==BLACK && m<0x10 && p==oo[m+16] ||\r
-                                                   color==WHITE && m>0x6F && p==oo[m-0x70]) b[m] -= 32;
-                                           } else { Q+=w[p]; R+=w[p]/FAC; }
+                                                   color==WHITE && m>0x6F && p==oo[m-0x70]) b[m] -= 32;\r
+                                                Q-=w[p]; // assume value was flipped to indicate royalty\r
+                                                if(pl[p+color])R-=w[p]/FAC; // capturable King, add to material\r
+                                           } else { Q+=w[p]; R+=w[p]/FAC; }\r
                                             if((m==0x00 || m==BW-1   ) && color==BLACK && p==oo[m+16] ||\r
                                                (m==0x70 || m==0x6F+BW) && color==WHITE && p==oo[m-0x70])\r
                                                 b[m] &= ~32; // corner piece as in original setup: virgin\r
                                        case 0: // undefined piece, ignore\r
                                             break;\r
                                         }\r
-                                        pl[BLACK+WHITE-color]++;\r
+                                        pl[BLACK+WHITE-color]++;pl[p+color]++;\r
                                         continue;\r
                                 }\r
                         }\r
@@ -812,8 +818,8 @@ int main(int argc, char **argv)
                        GamePtr = HistPtr = 0; Setup = 1; SetupQ = Q; // start anew\r
                        for(i=0; i<128; i++) setupPosition[i] = b[i]; // remember position\r
                        setupPosition[128] = Side;\r
-                       setupPosition[129] = pl[WHITE];\r
-                       setupPosition[130] = pl[BLACK];\r
+                       setupPosition[129] = R;\r
+                       for(i=0; i<32; i++) setupPosition[i+130] = pl[i];\r
                        continue;\r
                }\r
                 /* command not recognized, assume input move */\r