X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=fairymax.c;h=ffa6ca87065cf6beee3cb4ed18c5094721af2fef;hb=e78e7b6c6b164ea731454e9a8c85e87eed9e9022;hp=a78c851ee726bab0587c11219c3f94e593de682e;hpb=e5df489b7b5c71852d62fb69d9fb2ca87b9e97ad;p=fairymax.git diff --git a/fairymax.c b/fairymax.c index a78c851..ffa6ca8 100644 --- a/fairymax.c +++ b/fairymax.c @@ -18,7 +18,7 @@ /*****************************************************************/ #define MULTIPATH -#define VERSION "4.8R" +#define VERSION "4.8S" #include #include @@ -98,14 +98,13 @@ int MovesLeft; int MaxDepth; int Post; int Fifty; -int UnderProm; int GameNr; int Resign; int Cambodian; int Threshold = 800; int Score; int makruk; -int prom, pm, gating; +int prom, pm, gating, succession; char piecename[32], piecetype[32], blacktype[32]; char selectedFairy[80]; char *inifile = INI_FILE; @@ -188,7 +187,7 @@ int k,q,l,e,E,z,n; /* (q,l)=window, e=current eval. score, E=e.p. sqr.*/ } #endif m=E<16|(E^112)<16&&flag&1&y-E<2&E-y<2?I:m; /* bad castling */ - if(p<3&y==E)H=z&127; /* shift capt.sqr. H if e.p.*/ + if(p<3&y==E&flag)H=z&127; /* shift capt.sqr. H if e.p.*/ t=b[H]; if(flag&1+!t) /* mode (capt/nonc) allowed?*/ {if(t&&(t&16)==k)break; /* capture own */ @@ -365,8 +364,12 @@ int PrintResult(int s) if(cnt==-I+1) { if (s == WHITE) printf("0-1 {Black mates}\n"); - else + else { + if(succession) { // suppress loss claim if black might be able to replace its King by promotion + for(j=0;j=100) { @@ -404,7 +407,7 @@ void InitGame() if(w[oo[i]] < 0) k = w[oo[i]]; } R -= 2*(-k/FAC); - UnderProm = -1; pl[WHITE] = pl[BLACK] = 2*BW; + pl[WHITE] = pl[BLACK] = 2*BW; 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. if(gating) pl[14] = pl[15] = pl[30] = pl[31] = 1, R += 2*(w[9]/FAC + w[10]/FAC); } @@ -473,7 +476,7 @@ void LoadGame(char *name) if(fscanf(f, "version 4.8(%c)", &c)!=1 || c != 'w') { printf("telluser incompatible fmax.ini file\n"); exit(0); } - gating = 0; + gating = succession = 0; if(name != NULL) { /* search for game name in definition file */ if(!strcmp(name, "makruk") && Cambodian) name = "cambodian"; else @@ -508,6 +511,7 @@ void LoadGame(char *name) { od[++i]=j; centr[i] = c>='a'; blacktype[c&31]=i; piecename[i]=c&31; if(piecetype[c&31]==0) piecetype[c&31]=i; // only first + succession |= w[i] < -4; // expendable royalty; assume we can promote to it } j++; o[j]=0; /* 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]); /**/ @@ -572,12 +576,6 @@ int main(int argc, char **argv) N=0;K=I; if (D(Side,-I,I,Q,O,LL|S,3)==I) { Side ^= BLACK^WHITE; - if(UnderProm>=0 && UnderProm != L) - { printf("tellics I hate under-promotions!\n"); - printf("resign { underpromotion } \n"); - Computer = EMPTY; - continue; - } else UnderProm = -1; m = GetTickCount() - Ticks; printf("# times @ %u: real=%d cpu=%1.0f\n", m + Ticks, m, (CPUtime() - cpuT)/CLOCKS_PER_SEC); @@ -881,6 +879,7 @@ int main(int argc, char **argv) GT = (Side == WHITE ? piecetype : blacktype)[line[4]&31]; if(GT) PromPiece = (Side == WHITE ? 7 : 7+pm) - GT, GT |= 32 + Side; {char *c=line; K=c[0]-16*c[1]+799;L=c[2]-16*c[3]+799; } + if(w[GT&15] == -1) L = S; // spoil move for promotion to King if (m & line[1] != '@') /* doesn't have move syntax */ printf("Error (unknown command): %s\n", command);