1.1 --- a/src/game.c Sat Mar 22 17:23:07 2014 +0100 1.2 +++ b/src/game.c Sat Mar 22 18:56:52 2014 +0100 1.3 @@ -91,7 +91,7 @@ 1.4 } 1.5 } 1.6 1.7 -static _Bool validate_move(Board board, uint8_t mycolor, Move *move) { 1.8 +static _Bool validate_move(Board board, Move *move) { 1.9 _Bool result; 1.10 1.11 /* does piece exist */ 1.12 @@ -129,6 +129,9 @@ 1.13 /* is piece pinned */ 1.14 // TODO: make it so 1.15 1.16 + /* correct check and checkmate flags */ 1.17 + // TODO: make it so 1.18 + 1.19 return result; 1.20 } 1.21 1.22 @@ -137,10 +140,13 @@ 1.23 1.24 size_t len = strlen(mstr); 1.25 1.26 - /* remove check */ 1.27 + /* evaluate check/checkmate flags */ 1.28 if (mstr[len-1] == '+') { 1.29 len--; mstr[len] = '\0'; 1.30 move->check = TRUE; 1.31 + } else if (mstr[len-1] == '#') { 1.32 + len--; mstr[len] = '\0'; 1.33 + move->checkmate = TRUE; 1.34 } 1.35 1.36 if (len == 2) { 1.37 @@ -194,6 +200,7 @@ 1.38 const size_t buflen = 8; 1.39 char movestr[buflen]; 1.40 _Bool remisrejected = FALSE; 1.41 + uint8_t code; 1.42 1.43 while (1) { 1.44 move(boardy+3, 0); 1.45 @@ -236,12 +243,19 @@ 1.46 if (eval_move(board, mycolor, movestr, &move)) { 1.47 net_send_code(opponent, NETCODE_MOVE); 1.48 net_send_data(opponent, &move, sizeof(Move)); 1.49 - if (net_recieve_code(opponent) == NETCODE_ACCEPT) { 1.50 - apply_move(board, &move); 1.51 - return 0; 1.52 - } else { 1.53 + code = net_recieve_code(opponent); 1.54 + move.check = code == NETCODE_CHECK; 1.55 + move.checkmate = code == NETCODE_CHECKMATE; 1.56 + // TODO: record move 1.57 + if (code == NETCODE_DECLINE) { 1.58 printw("Invalid move."); 1.59 clrtoeol(); 1.60 + } else { 1.61 + apply_move(board, &move); 1.62 + if (move.checkmate) { 1.63 + printw("Checkmate!"); 1.64 + return 1; 1.65 + } 1.66 } 1.67 } else { 1.68 printw("Can't interpret move - please use algebraic notation."); 1.69 @@ -250,7 +264,7 @@ 1.70 } 1.71 } 1.72 1.73 -static int recvmove(Board board, uint8_t mycolor, int opponent) { 1.74 +static int recvmove(Board board, int opponent) { 1.75 1.76 while (1) { 1.77 move(boardy+3, 0); 1.78 @@ -280,9 +294,16 @@ 1.79 break; 1.80 case NETCODE_MOVE: 1.81 net_recieve_data(opponent, &move, sizeof(Move)); 1.82 - if (validate_move(board, mycolor, &move)) { 1.83 + if (validate_move(board, &move)) { 1.84 apply_move(board, &move); 1.85 - net_send_code(opponent, NETCODE_ACCEPT); 1.86 + // TODO: record move 1.87 + if (move.check) { 1.88 + net_send_code(opponent, NETCODE_CHECK); 1.89 + } else if (move.checkmate) { 1.90 + net_send_code(opponent, NETCODE_CHECKMATE); 1.91 + } else { 1.92 + net_send_code(opponent, NETCODE_ACCEPT); 1.93 + } 1.94 return 0; 1.95 } else { 1.96 net_send_code(opponent, NETCODE_DECLINE); 1.97 @@ -315,10 +336,10 @@ 1.98 if (myturn) { 1.99 running = !sendmove(board, mycolor, opponent); 1.100 } else { 1.101 - running = !recvmove(board, mycolor, opponent); 1.102 + running = !recvmove(board, opponent); 1.103 flushinp(); // flush any input the user hacked in while waiting 1.104 } 1.105 - myturn ^= 1; 1.106 + myturn ^= TRUE; 1.107 } while (running); 1.108 1.109 mvaddstr(getmaxy(tchess_window)-1, 0,