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
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
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
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
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
if(w[p]<0) { // Royal piece on original square: virgin
if(color==BLACK && m<0x10 && p==oo[m+16] ||\r
color==WHITE && m>0x6F && p==oo[m-0x70]) b[m] -= 32;
+ Q-=w[p]; // assume value was flipped to indicate royalty
+ if(pl[p+color])R-=w[p]/FAC; // capturable King, add to material
} else { Q+=w[p]; R+=w[p]/FAC; }
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
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