diff -r 4e4f156bba58 -r 1347e4dabac0 src/game.c --- a/src/game.c Sat Mar 22 16:25:49 2014 +0100 +++ b/src/game.c Sat Mar 22 17:23:07 2014 +0100 @@ -29,6 +29,7 @@ #include "game.h" #include "input.h" +#include "rules/rules.h" #include #include @@ -91,16 +92,39 @@ } static _Bool validate_move(Board board, uint8_t mycolor, Move *move) { - _Bool result = TRUE; + _Bool result; /* does piece exist */ - result &= board[move->fromrow][move->fromfile] == move->piece; + result = board[move->fromrow][move->fromfile] == move->piece; - /* does move comply to rules */ - // TODO: make it so - - /* is piece blocked */ - // TODO: make it so + switch (move->piece & PIECE_MASK) { + case PAWN: + result = result && pawn_chkrules(board, move); + result = result && !pawn_isblocked(board, move); + break; + case ROOK: + result = result && rook_chkrules(board, move); + result = result && !rook_isblocked(board, move); + break; + case KNIGHT: + result = result && knight_chkrules(board, move); + result = result && !knight_isblocked(board, move); + break; + case BISHOP: + result = result && bishop_chkrules(board, move); + result = result && !bishop_isblocked(board, move); + break; + case QUEEN: + result = result && queen_chkrules(board, move); + result = result && !queen_isblocked(board, move); + break; + case KING: + result = result && king_chkrules(board, move); + result = result && !king_isblocked(board, move); + break; + default: + result = FALSE; + } /* is piece pinned */ // TODO: make it so @@ -122,28 +146,17 @@ if (len == 2) { /* pawn move (e.g. "e4") */ if (isfile(mstr[0]) && isrow(mstr[1])) { - move->piece = PAWN; - move->fromfile = move->tofile = fileidx(mstr[0]); + move->piece = PAWN|mycolor; + move->tofile = fileidx(mstr[0]); move->torow = rowidx(mstr[1]); - move->fromrow = rowidx(mstr[1]) + (mycolor == WHITE ? -1 : 1); - if (move->fromrow > 6) { + if (!pawn_getlocation(board, move)) { move->piece = 0; - } else { - /* advanced first move */ - if (move->fromrow == (mycolor == WHITE ? 2 : 5) && - board[move->fromrow][move->fromfile] != (mycolor|PAWN)) { - - move->fromrow += (mycolor == WHITE ? -1 : 1); - if (move->fromrow > 6) { - move->piece = 0; - } - } } } } else if (len == 3) { if (strcmp(mstr, "O-O") == 0) { /* king side castling */ - move->piece = KING; + move->piece = KING|mycolor; move->fromfile = fileidx('e'); move->tofile = fileidx('g'); move->fromrow = move->torow = mycolor == WHITE ? 0 : 7; @@ -159,7 +172,7 @@ } else if (len == 5) { if (strcmp(mstr, "O-O-O") == 0) { /* queen side castling "O-O-O" */ - move->piece = KING; + move->piece = KING|mycolor; move->fromfile = fileidx('e'); move->tofile = fileidx('c'); move->fromrow = move->torow = mycolor == WHITE ? 0 : 7; @@ -174,12 +187,7 @@ /* long notation capture (e.g. "Nc5xf3") */ } - if (move->piece) { - move->piece |= mycolor; - return TRUE; - } else { - return FALSE; - } + return move->piece != 0; } static int sendmove(Board board, uint8_t mycolor, int opponent) {