/* generate pawn captures and promotions */ void genattacksp(int f, int r, int c) { int forward = dir(c); square loc = SQ(f,r); r += forward; if (f<7) { chesspiece p = getpiece(f+1, r); if (p&&chesspiececolor(p)!=c) pushmove(MV(loc, SQ(f+1, r))); } if (f>0) { chesspiece p = getpiece(f-1,r); if (p&&chesspiececolor(p)!=c) pushmove(MV(loc, SQ(f-1, r))); } if (c==WHITE) { if ((r==6)&&emptyp(f,r)) pushmove(MV(loc, SQ(f,r))); } else { if ((r==1)&&emptyp(f,r)) pushmove(MV(loc, SQ(f,r))); } /* get en passante */ if (doublepushp()) { square start; square end; move m; m = lastmove(); start = FR(m); end = TO(m); r -= forward; /* restore to original r */ if (R(end) == r) { if (((f+1) == F(start))|| ((f-1) == F(start))) pushmove(MV(loc, SQ(F(start),forward+r))); } } }
void genmoves_nocastles() { int f,r; int col = tomove(); for (f=0;f<8;f++) { for (r=0;r<8;r++) { chesspiece p = getpiece(f,r); if (p && (chesspiececolor(p) == col)) { int v = chesspiecevalue(p); if (v==king) { getmovesk_nocastles(f,r,col); } else { generators[v](f,r,col); } } } } }
void getmovesn(int f, int r, int c) { int i, nf, nr; int o; chesspiece p; square s1; s1 = SQ(f,r); o = opp(c); for (i=0;i<8;i++) { nf = f+df[i]; nr = r+dr[i]; if (offboardp(nf,nr)) continue; p = getpiece(nf, nr); if (!p || (c != chesspiececolor(p))) { pushmove(MV(s1, SQ(nf, nr))); } } }
void getsliders(int f, int r, int df, int dr, int color) { square s1 = SQ(f,r); chesspiece p; for (;;) { f += df; r += dr; if (offboardp(f,r)) return; p = getpiece(f,r); if (p == empty) pushmove(MV(s1, SQ(f,r))); else if (chesspiececolor(p)==color) return; else { pushmove(MV(s1, SQ(f,r))); return; } } }
void gensliderattacksDEC(square s, int dd, int color) { chesspiece p; square s2 = s; for (;;) { s2 += dd; /* dd should be negative */ if ((s2&001)==0) /* if at RANK 8 then we have looped */ break; if ((s2&~(077))!=0) break; p = getpiece__(s2); if (p) { if (chesspiececolor(p) != color) { pushmove(MV(s, s2)); return; } return; } } }
void gensliderattacksINC(square s, int dd, int color) { chesspiece p; square s2 = s; for (;;) { s2 += dd; if ((s2&007)==0) /* if at RANK 1 we have looped */ break; if ((s2&~(077))!=0) break; p = getpiece__(s2); if (p) { if (chesspiececolor(p) != color) { pushmove(MV(s, s2)); return; } return; } } }
void gensliderattacks(int f, int r, int df, int dr, int color) { chesspiece p; square s1=SQ(f,r); for (;;) { f += df; r += dr; if (offboardp (f,r)) return; p = getpiece(f,r); if (p) { if (chesspiececolor(p) != color) { pushmove(MV(s1, SQ(f,r))); return; } return; } } }
void genmoves() { int f,r; int col = tomove(); for (f=0; f<8; f++) for (r=0; r<8; r++) { chesspiece p = getpiece(f,r); if (p && (chesspiececolor(p) == col)) { int v = chesspiecevalue(p); generators[v](f,r,col); } } }
void genattacks() { int f,r; int col = tomove(); for (f=0; f<8; f++) for (r=0; r<8; r++) { chesspiece p = getpiece(f,r); if (p && (chesspiececolor(p)==col)) { int v; v = chesspiecevalue(p); attackgens[v](f,r,col); } } }
void cmd_board(char *s) { int f,r; for (r=7;r>=0;r--) { for (f=0;f<8;f++) { chesspiece p=getpiece(f,r); printf("%c %2d %2d\t", rep(p), chesspiececolor(p), chesspiecevalue(p)); } printf("\n"); } printf("piece counts [%2d %2d]\n", board->piececount[0], board->piececount[1]); for (f=WPAWN;f<=BKING;f++) { printf("%c = %2d\n", rep(f), board->pieces[f]); } }
void getmovesk_nocastles(int f, int r, int c) { int df, dr, nf, nr; int o; chesspiece p; square s1 = SQ(f,r); o = opp(c); for (df=-1;df<2;df++) for (dr=-1;dr<2;dr++) { if (!df && !dr) continue; nf = f+df; nr = r+dr; p = getpiece(nf, nr); if (!offboardp(nf, nr) && (!p || (c != chesspiececolor(p)))) pushmove(MV(s1, SQ(nf, nr))); } }
void getmovesk(int f, int r, int c) { int df, dr, nf, nr; int o; chesspiece p; square s1 = SQ(f,r); o = opp(c); for (df=-1; df<2; df++) for (dr=-1; dr<2; dr++) { if (!df && !dr) continue; nf = f+df; nr = r+dr; p = getpiece(nf, nr); if (!offboardp(nf, nr) && (!p || (c != chesspiececolor(p)))) pushmove(MV(s1, SQ(nf, nr))); } if (c==WHITE) { if (wqcastlep()&& !getpiece__(D1)&& !getpiece__(C1)&& !getpiece__(B1)&& !incheckp(c)&& !wouldbeincheckp(THRUWQ)) { pushmove(WQC); } if (wkcastlep()&& !getpiece__(F1)&& !getpiece__(G1)&& !incheckp(c)&& !wouldbeincheckp(THRUWK)) { pushmove(WKC); } } else { if (bqcastlep()&& !getpiece__(D8)&& !getpiece__(C8)&& !getpiece__(B8)&& !incheckp(c)&& !wouldbeincheckp(THRUBQ)) { pushmove(BQC); } if (bkcastlep()&& !getpiece__(F8)&& !getpiece__(G8)&& !incheckp(c)&& !wouldbeincheckp(THRUBK)) { pushmove(BKC); } } }