int Threshold = 800;\r
int Score;\r
int makruk;\r
-int prom;\r
+int prom, pm;\r
char piecename[32], piecetype[32], blacktype[32];\r
char selectedFairy[80];\r
char *inifile = INI_FILE;\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&&(pl[t&31]<2||kk!=H&kk!=S||(kk=H,i=-i,0)))m=I,d=98;/* K capture, duple check */\r
+ if(i<0&&(pl[t&31]<2|| /* K capture, (of last K), */\r
+ t>>3&kk!=H&kk!=S||(kk=H,i=-i,0)))m=I,d=98;/* or duple check: cutoff*/\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
(x+2&M||b[x+2]-u) /* squares plus bias */\r
+(w[b[x^16]&15]<0)) /*** cling to magnetic K ***/\r
+(R-76>>2); /* end-game Pawn-push bonus */\r
- b[y]+=V=y+r+1&S?647-p:2*(u&y+16&32); /* upgrade P or convert to Q*/\r
+ b[y]+=V=y+r+1&S?647-p|pm:2*(u&y+16&32);/*upgrade P or convert to Q*/\r
if(V&makruk)b[y]=u|7,V=480; /* Makruk promotion on 6th */\r
V>>=sh; /* for Shatranj promo to F */\r
i+=V; /* promotion / passer bonus */\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
+ if(w[oo[K+16]+16] == -1)pl[oo[K+16]+16]=1;\r
+ if(w[oo[K]] == -1)pl[oo[K]]=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
Fifty = 0; R = 0;\r
for(i=0; i<BW; i++) if(i!=3) R += (w[oo[i]]/FAC) + (w[oo[i+16]]/FAC);\r
UnderProm = -1; pl[WHITE] = pl[BLACK] = 2*BW;\r
+ pm = !pl[BLACK+7] && pl[BLACK+9] && pl[WHITE+7] ? 2 : 0; // Unlike white, black has no 'Q', so promote to 9, which he does have.\r
}\r
\r
void CopyBoard(int s)\r
break;\r
}\r
pl[BLACK+WHITE-color]++;pl[p+color]++;\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
}\r
/* command not recognized, assume input move */\r
m = line[0]<'a' | line[0]>='a'+BW | line[1]<'1' | line[1]>='1'+BH |\r
line[2]<'a' | line[2]>='a'+BW | line[3]<'1' | line[3]>='1'+BH;\r
- if(line[4] == '\n') line[4] = piecename[7];\r
- PromPiece = 7 - (Side == WHITE ? piecetype : blacktype)[line[4]&31];\r
- if(PromPiece == 7) PromPiece = 0;\r
+ if(line[4] == '\n') line[4] = 0;\r
+ PromPiece = (Side == WHITE ? piecetype : blacktype)[line[4]&31];\r
+ if(PromPiece) PromPiece = (Side == WHITE ? 7 : 7+pm) - PromPiece;\r
{char *c=line; K=c[0]-16*c[1]+799;L=c[2]-16*c[3]+799; }\r
if (m)\r
/* doesn't have move syntax */\r