diff -r 41017d0a72c5 -r 84f2e380a434 src/game.c --- a/src/game.c Mon Jun 16 13:45:31 2014 +0200 +++ b/src/game.c Mon Jun 16 15:41:06 2014 +0200 @@ -174,7 +174,7 @@ char filename[64]; int y = getcury(stdscr); - if (getnstr(filename, 64) == OK) { + if (getnstr(filename, 64) == OK && filename[0] != '\0') { move(y, 0); FILE *file = fopen(filename, "w"); if (file) { @@ -322,8 +322,7 @@ int eval_result = eval_move(gamestate, movestr, &move, mycolor); switch (eval_result) { case VALID_MOVE_SYNTAX: - net_send_data(opponent, NETCODE_MOVE, &move, - sizeof(Move)-8); + net_send_data(opponent, NETCODE_MOVE, &move, sizeof(Move)); code = net_recieve_code(opponent); move.check = code == NETCODE_CHECK || code == NETCODE_CHECKMATE; @@ -423,13 +422,11 @@ } break; case NETCODE_MOVE: - net_recieve_data(opponent, &move, sizeof(Move)-8); + net_recieve_data(opponent, &move, sizeof(Move)); code = validate_move(gamestate, &move); if (code == VALID_MOVE_SEMANTICS) { apply_move(gamestate, &move); - if (move.check) { - net_send_code(opponent, NETCODE_CHECK); - } else if (gamestate->checkmate) { + if (gamestate->checkmate) { net_send_code(opponent, NETCODE_CHECKMATE); printw("\rCheckmate!"); clrtoeol(); @@ -439,6 +436,8 @@ printw("\rStalemate!"); clrtoeol(); return 1; + } else if (move.check) { + net_send_code(opponent, NETCODE_CHECK); } else { net_send_code(opponent, NETCODE_ACCEPT); } @@ -523,28 +522,34 @@ post_game(&gamestate, &(settings->gameinfo)); } -void game_start(Settings *settings, int opponent) { +void game_continue(Settings *settings, int opponent, GameState *gamestate) { inputy = getmaxy(stdscr) - 6; - _Bool myturn = is_server(settings) == - (settings->gameinfo.servercolor == WHITE); - uint8_t mycolor = myturn ? WHITE : BLACK; + uint8_t mycolor = is_server(settings) ? settings->gameinfo.servercolor : + opponent_color(settings->gameinfo.servercolor); - GameState gamestate; - gamestate_init(&gamestate); + _Bool myturn = (gamestate->lastmove ? + (gamestate->lastmove->move.piece & COLOR_MASK) : WHITE) != mycolor; _Bool running; do { clear(); - draw_board(&gamestate, mycolor); + draw_board(gamestate, mycolor); if (myturn) { - running = !sendmove(&gamestate, &(settings->gameinfo), + running = !sendmove(gamestate, &(settings->gameinfo), opponent, mycolor); } else { - running = !recvmove(&gamestate, &(settings->gameinfo), opponent); + running = !recvmove(gamestate, &(settings->gameinfo), opponent); } myturn ^= TRUE; } while (running); - post_game(&gamestate, &(settings->gameinfo)); + post_game(gamestate, &(settings->gameinfo)); } + +void game_start(Settings *settings, int opponent) { + GameState gamestate; + gamestate_init(&gamestate); + + game_continue(settings, opponent, &gamestate); +}