src/game.c

changeset 11
08d7a6e3ec31
parent 10
1347e4dabac0
child 12
84880c7e1ea6
     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,

mercurial