src/rules/pawn.c

changeset 14
970748b9a73b
parent 12
84880c7e1ea6
child 15
7ffd66591afe
     1.1 --- a/src/rules/pawn.c	Wed Mar 26 14:12:59 2014 +0100
     1.2 +++ b/src/rules/pawn.c	Wed Mar 26 14:53:15 2014 +0100
     1.3 @@ -30,28 +30,44 @@
     1.4  #include "pawn.h"
     1.5  
     1.6  _Bool pawn_chkrules(Board board, Move *move) {
     1.7 -    // TODO: implement
     1.8 -    return TRUE;
     1.9 +    int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1);
    1.10 +    if (move->capture) {
    1.11 +        if (move->fromrow == move->torow + d && (
    1.12 +            move->fromfile == move->tofile + 1 ||
    1.13 +            move->fromfile == move->tofile - 1)) {
    1.14 +            // TODO: en passant
    1.15 +            return mdst(board,move) != 0; /* color has been checked */
    1.16 +        } else {
    1.17 +            return FALSE;
    1.18 +        }
    1.19 +    } else {
    1.20 +        if (move->fromfile == move->tofile) {
    1.21 +            return (move->fromrow == move->torow + d) ||
    1.22 +                (move->fromrow == (d < 0 ? 1 : 6) && /* advanced first move */
    1.23 +                move->fromrow == move->torow + d*2);
    1.24 +        } else {
    1.25 +            return FALSE;
    1.26 +        }
    1.27 +    }
    1.28  }
    1.29  
    1.30  _Bool pawn_isblocked(Board board, Move *move) {
    1.31 -    // TODO: implement
    1.32 -    return FALSE;
    1.33 +    return mdst(board,move) && !move->capture;
    1.34  }
    1.35  
    1.36  _Bool pawn_getlocation(Board board, Move *move) {
    1.37      int8_t d = ((move->piece & COLOR_MASK) == WHITE ? -1 : 1);
    1.38      
    1.39 -    // TODO: battle moves
    1.40 -    
    1.41 -    move->fromfile = move->tofile;
    1.42 +    if (move->fromfile == POS_UNSPECIFIED) {
    1.43 +        move->fromfile = move->tofile;
    1.44 +    }
    1.45      move->fromrow = move->torow + d;
    1.46      if (move->fromrow > 6) {
    1.47          return FALSE;
    1.48      } else {
    1.49          /* advanced first move */
    1.50          if (move->fromrow == (d < 0 ? 2 : 5) &&
    1.51 -            board[move->fromrow][move->fromfile] != move->piece) {
    1.52 +            msrc(board,move) != move->piece) {
    1.53  
    1.54              move->fromrow += d;
    1.55              if (move->fromrow > 6) {

mercurial