diff -r faec61c4901f -r 970748b9a73b src/rules/pawn.c --- a/src/rules/pawn.c Wed Mar 26 14:12:59 2014 +0100 +++ b/src/rules/pawn.c Wed Mar 26 14:53:15 2014 +0100 @@ -30,28 +30,44 @@ #include "pawn.h" _Bool pawn_chkrules(Board board, Move *move) { - // TODO: implement - return TRUE; + int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1); + if (move->capture) { + if (move->fromrow == move->torow + d && ( + move->fromfile == move->tofile + 1 || + move->fromfile == move->tofile - 1)) { + // TODO: en passant + return mdst(board,move) != 0; /* color has been checked */ + } else { + return FALSE; + } + } else { + if (move->fromfile == move->tofile) { + return (move->fromrow == move->torow + d) || + (move->fromrow == (d < 0 ? 1 : 6) && /* advanced first move */ + move->fromrow == move->torow + d*2); + } else { + return FALSE; + } + } } _Bool pawn_isblocked(Board board, Move *move) { - // TODO: implement - return FALSE; + return mdst(board,move) && !move->capture; } _Bool pawn_getlocation(Board board, Move *move) { int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1); - // TODO: battle moves - - move->fromfile = move->tofile; + if (move->fromfile == POS_UNSPECIFIED) { + move->fromfile = move->tofile; + } move->fromrow = move->torow + d; if (move->fromrow > 6) { return FALSE; } else { /* advanced first move */ if (move->fromrow == (d < 0 ? 2 : 5) && - board[move->fromrow][move->fromfile] != move->piece) { + msrc(board,move) != move->piece) { move->fromrow += d; if (move->fromrow > 6) {