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) {