#else\r
# define FAC 128\r
# define EG 10\r
-# define NAME "Fairy-Max"\r
+# define NAME "Pair-o-Max"\r
# define SHAMAX(x)\r
# define FMAX(x) x\r
#endif\r
of[256],\r
od[16]; /* 1st dir. in o[] per piece*/\r
\r
-signed char L,pl[32],\r
+signed char L,pl[32],pb[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]=0;b[x]=gt;b[y]=u|32; /* do move, set non-virgin */\r
- pl[t&31]-=!!t; /* updat victim piece count */\r
+ i+=-((pl[t&31]-=!!t)&1)&pb[t&31];/* update piece count, pair bonus */\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
i+=V; /* promotion / passer bonus */\r
} if(z&S && GamePtr<6) v+=(rand()>>10&31)-16;\r
J+=J(0);Z+=J(4)+G-S;\r
- SHAMAX( pl[k]-=!!t; ) /* count pieces per side */\r
+ pl[k]-=!!t; /* count pieces per side */\r
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
{if(v+I&&x==K&y==L>==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
+ pl[u&31]--,pl[prom&31]++,Z+=PromPiece;/*piece & 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
return l;} /* & not in check, signal */\r
v=m; /* (prevent fail-lows on */\r
} /* K-capt. replies) */\r
- SHAMAX( pl[k]+=!!t; ) pl[t&31]+=!!t;\r
+ 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&&K==I&d>2&v>V&v<l){int *p=ps;char X,Y;\r
for(i=0; i<BW; i++) {\r
R += abs(w[oo[i]])/FAC + abs(w[oo[i+16]])/FAC;\r
Q += abs(w[oo[i]]) - abs(w[oo[i+16]]) + w[1] - w[2];\r
+ Q += (pl[i]>>1)*pb[i] -(pl[i+16]>>1)*pb[i];\r
if(w[oo[i]] < 0) k = w[oo[i]];\r
}\r
R -= 2*(-k/FAC);\r
blacktype[c&31]=i; piecename[i]=c&31;\r
if(piecetype[c&31]==0) piecetype[c&31]=i; // only first\r
succession |= w[i] < -4; // expendable royalty; assume we can promote to it\r
+ } else {\r
+ if(!o[j]) pb[i] = pb[i+16] = of[j--]; // hand-set pair bonus\r
}\r
j++; o[j]=0;\r
/* printf("# c='%c' i=%d od[i]=%d j=%d (%3d,%8x)\n",c?c:' ',i,od[i],j,o[j-1],of[j-1]); /**/\r
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
} 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
case 0: // undefined piece, ignore\r
break;\r
}\r
- pl[BLACK+WHITE-color]++;pl[p+color]++;\r
+ pl[BLACK+WHITE-color]++; if(pl[p+color]++&1) Q+=pb[p];\r
if(w[p+color] == -1)pl[p+color]=1; // fake we have one if value = -1, to thwart extinction condition\r
continue;\r
}\r
else { int i=-1;\r
if(b[L] && (b[L]&16) == Side && w[b[L]&15] < 0) // capture own King: castling\r
{ i=K; K = L; L = i>L ? i-1 : i+2; }\r
- if(w[GT&15] < -1) pl[GT&31]++, J+=89729; // promotion to royal piece\r
if((b[K]&15) < 3) GT = 0; // Pawn => true promotion rather than gating\r
if(D(Side,-I,I,Q,O,LL|S,3)!=I) {\r
/* did have move syntax, but illegal move */\r