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
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
{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
((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
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
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
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
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
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