src/game.c

changeset 10
1347e4dabac0
parent 9
4e4f156bba58
child 11
08d7a6e3ec31
     1.1 --- a/src/game.c	Sat Mar 22 16:25:49 2014 +0100
     1.2 +++ b/src/game.c	Sat Mar 22 17:23:07 2014 +0100
     1.3 @@ -29,6 +29,7 @@
     1.4  
     1.5  #include "game.h"
     1.6  #include "input.h"
     1.7 +#include "rules/rules.h"
     1.8  #include <ncurses.h>
     1.9  #include <string.h>
    1.10  
    1.11 @@ -91,16 +92,39 @@
    1.12  }
    1.13  
    1.14  static _Bool validate_move(Board board, uint8_t mycolor, Move *move) {
    1.15 -    _Bool result = TRUE;
    1.16 +    _Bool result;
    1.17      
    1.18      /* does piece exist */
    1.19 -    result &= board[move->fromrow][move->fromfile] == move->piece;
    1.20 +    result = board[move->fromrow][move->fromfile] == move->piece;
    1.21      
    1.22 -    /* does move comply to rules */
    1.23 -    // TODO: make it so
    1.24 -    
    1.25 -    /* is piece blocked */
    1.26 -    // TODO: make it so
    1.27 +    switch (move->piece & PIECE_MASK) {
    1.28 +    case PAWN:
    1.29 +        result = result && pawn_chkrules(board, move);
    1.30 +        result = result && !pawn_isblocked(board, move);
    1.31 +        break;
    1.32 +    case ROOK:
    1.33 +        result = result && rook_chkrules(board, move);
    1.34 +        result = result && !rook_isblocked(board, move);
    1.35 +        break;
    1.36 +    case KNIGHT:
    1.37 +        result = result && knight_chkrules(board, move);
    1.38 +        result = result && !knight_isblocked(board, move);
    1.39 +        break;
    1.40 +    case BISHOP:
    1.41 +        result = result && bishop_chkrules(board, move);
    1.42 +        result = result && !bishop_isblocked(board, move);
    1.43 +        break;
    1.44 +    case QUEEN:
    1.45 +        result = result && queen_chkrules(board, move);
    1.46 +        result = result && !queen_isblocked(board, move);
    1.47 +        break;
    1.48 +    case KING:
    1.49 +        result = result && king_chkrules(board, move);
    1.50 +        result = result && !king_isblocked(board, move);
    1.51 +        break;
    1.52 +    default:
    1.53 +        result = FALSE;
    1.54 +    }
    1.55      
    1.56      /* is piece pinned */
    1.57      // TODO: make it so
    1.58 @@ -122,28 +146,17 @@
    1.59      if (len == 2) {
    1.60          /* pawn move (e.g. "e4") */
    1.61          if (isfile(mstr[0]) && isrow(mstr[1])) {
    1.62 -            move->piece = PAWN;
    1.63 -            move->fromfile = move->tofile = fileidx(mstr[0]);
    1.64 +            move->piece = PAWN|mycolor;
    1.65 +            move->tofile = fileidx(mstr[0]);
    1.66              move->torow = rowidx(mstr[1]);
    1.67 -            move->fromrow = rowidx(mstr[1]) + (mycolor == WHITE ? -1 : 1);
    1.68 -            if (move->fromrow > 6) {
    1.69 +            if (!pawn_getlocation(board, move)) {
    1.70                  move->piece = 0;
    1.71 -            } else {
    1.72 -                /* advanced first move */
    1.73 -                if (move->fromrow == (mycolor == WHITE ? 2 : 5) &&
    1.74 -                    board[move->fromrow][move->fromfile] != (mycolor|PAWN)) {
    1.75 -                    
    1.76 -                    move->fromrow += (mycolor == WHITE ? -1 : 1);
    1.77 -                    if (move->fromrow > 6) {
    1.78 -                        move->piece = 0;
    1.79 -                    }
    1.80 -                }
    1.81              }
    1.82          }
    1.83      } else if (len == 3) {
    1.84          if (strcmp(mstr, "O-O") == 0) {
    1.85              /* king side castling */
    1.86 -            move->piece = KING;
    1.87 +            move->piece = KING|mycolor;
    1.88              move->fromfile = fileidx('e');
    1.89              move->tofile = fileidx('g');
    1.90              move->fromrow = move->torow = mycolor == WHITE ? 0 : 7;
    1.91 @@ -159,7 +172,7 @@
    1.92      } else if (len == 5) {
    1.93          if (strcmp(mstr, "O-O-O") == 0) {
    1.94              /* queen side castling "O-O-O" */
    1.95 -            move->piece = KING;
    1.96 +            move->piece = KING|mycolor;
    1.97              move->fromfile = fileidx('e');
    1.98              move->tofile = fileidx('c');
    1.99              move->fromrow = move->torow = mycolor == WHITE ? 0 : 7;
   1.100 @@ -174,12 +187,7 @@
   1.101          /* long notation capture (e.g. "Nc5xf3") */
   1.102      }
   1.103      
   1.104 -    if (move->piece) {
   1.105 -        move->piece |= mycolor;
   1.106 -        return TRUE;
   1.107 -    } else {
   1.108 -        return FALSE;
   1.109 -    }
   1.110 +    return move->piece != 0;
   1.111  }
   1.112  
   1.113  static int sendmove(Board board, uint8_t mycolor, int opponent) {

mercurial