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 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 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))); } }
move easydecode(char *str) { if (!strcmp(str,"o")||!strcmp(str,"o-o")|| !strcmp(str,"0-0")||!strcmp("O-O",str)) { return (tomove() == WHITE) ? WKC : BKC; } if (!strcmp(str,"o-")||!strcmp(str,"o-o-o")|| !strcmp(str,"0-0-0")||!strcmp("O-O-O",str)) { return (tomove() == WHITE) ? WQC : BQC; } strip(str); if (strlen(str)==5) { /* assume this is the form a7a8q */ /* get promo and remove from string */ chesspiece p = lookup(str[4]); promopiece = chesspiecevalue(p); if ((promopiece<=0)||(promopiece>king)) return dummymove; str[4]=0; } /* e4 */ if (strlen(str)==2) { int ef, er; square s1, s2; ef = str[0]-'a'; er = str[1]-'1'; if (strchr("abcdefgh", str[0]) && strchr("abcdefgh", str[1])) { return decode_pawn_cap(str); } if (offboardp(ef, er)) return dummymove; s2 = SQ(ef,er); s1 = findstart(makepiece(tomove(), pawn), ef, er, 8, 8); return MV(s1,s2); } /* Pe4 ab4 */ if (strlen(str)==3) { int sf, ef, er; square s1 = dummymove, s2; ef = str[1]-'a'; er = str[2]-'1'; if (offboardp(ef, er)) return dummymove; s2 = SQ(ef,er); if (str[0]=='b') { /* if its a valid pawn move it, else look for valid Bishop move */ int v = chesspiecevalue(lookup(str[0])); sf = str[0] - 'a'; s1 = findstart(makepiece(tomove(), pawn), ef, er, sf, 8); if (s1!=dummysq) { return MV(s1,s2); } else if (v) { s1 = findstart(makepiece(tomove(), v), ef, er, 8, 8); return MV(s1,s2); } else return dummysq; } else if (lookup(str[0])) { int v = chesspiecevalue(lookup(str[0])); s1 = findstart(makepiece(tomove(), v), ef, er, 8, 8); } else { sf = str[0] - 'a'; s1 = findstart(makepiece(tomove(), pawn), ef, er, sf, 8); } return (MV(s1,s2)); } /* e2e4 Nbd7 N8d7*/ else if (strlen(str)==4) { int sf, sr, ef, er, v; square s1, s2; sf = str[0]-'a'; sr = str[1]-'1'; ef = str[2]-'a'; er = str[3]-'1'; if (offboardp(ef, er)) return dummymove; if (!offboardp(sf, sr)) return MV(SQ(sf,sr),SQ(ef,er)); s2 = SQ(ef, er); s1 = SQ(sf, sr); switch (str[0]) { case 'P': case 'p': case 'N': case 'n': case 'B': case 'b': case 'R': case 'r': case 'Q': case 'q': case 'K': case 'k': sf = str[1]-'a'; sr = str[1]-'1'; v = chesspiecevalue(lookup(str[0])); if ((sf>=0)&&(sf<=7)) { s1 = findstart(makepiece(tomove(), v), ef, er, sf, 8); return MV(s1, s2); } else { s1 = findstart(makepiece(tomove(), v), ef, er, 8, sr); return MV(s1, s2); } default: return dummymove; } } else return dummymove; }
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); } } }