# HG changeset patch # User Mike Becker # Date 1749230354 -7200 # Node ID ead00609e5e659b8723fbd4adb1f895679a76f92 # Parent e75865d90111ca074099ddc4dc536080c1f131d1 fix that network connection is still open during game review diff -r e75865d90111 -r ead00609e5e6 src/client.c --- a/src/client.c Thu Jun 05 19:05:02 2025 +0200 +++ b/src/client.c Fri Jun 06 19:19:14 2025 +0200 @@ -76,13 +76,17 @@ } uint8_t code = net_recieve_code(server.fd); + GameState gamestate; + gamestate_init(&gamestate); + bool played = false; if (code == NETCODE_GAMEINFO) { /* Start new game */ net_recieve_data(server.fd, &(settings->gameinfo), sizeof(GameInfo)); dump_gameinfo(&(settings->gameinfo)); if (prompt_yesno("Accept challenge")) { net_send_code(server.fd, NETCODE_ACCEPT); - game_start(settings, server.fd); + game_play(settings, &gamestate, server.fd); + played = true; } else { net_send_code(server.fd, NETCODE_DECLINE); } @@ -93,18 +97,17 @@ net_recieve_data(server.fd, &mc, sizeof(mc)); Move *moves = calloc(mc, sizeof(Move)); net_recieve_data(server.fd, moves, mc*sizeof(Move)); - GameState continuegame; - gamestate_init(&continuegame); for (size_t i = 0 ; i < mc ; i++) { - apply_move(&continuegame, &(moves[i])); + apply_move(&gamestate, &(moves[i])); } free(moves); addch('\n'); - dump_moveinfo(&continuegame); + dump_moveinfo(&gamestate); if (prompt_yesno( "\n\nServer wants to continue a game. Accept challenge")) { net_send_code(server.fd, NETCODE_ACCEPT); - game_continue(settings, server.fd, &continuegame); + game_play(settings, &gamestate, server.fd); + played = true; } else { net_send_code(server.fd, NETCODE_DECLINE); } @@ -113,7 +116,11 @@ net_destroy(&server); return 1; } - + + if (played) { + game_review(settings, &gamestate); + } + net_destroy(&server); return 0; } diff -r e75865d90111 -r ead00609e5e6 src/game.c --- a/src/game.c Thu Jun 05 19:05:02 2025 +0200 +++ b/src/game.c Fri Jun 06 19:19:14 2025 +0200 @@ -469,14 +469,12 @@ } } -static void post_game(Settings* settings, GameState *gamestate) { +void game_review(Settings* settings, GameState *gamestate) { GameInfo *gameinfo = &(settings->gameinfo); move(0,0); draw_board(gamestate, WHITE, settings->unicode); - // TODO: network connection is still open here - think about it! - mvaddstr(getmaxy(stdscr)-1, 0, "Press 'q' to quit or 's' to save a PGN file..."); refresh(); @@ -499,7 +497,7 @@ gamestate_cleanup(gamestate); } -void game_start_singlemachine(Settings *settings) { +void game_play_singlemachine(Settings *settings) { inputy = getmaxy(stdscr) - 6; GameState gamestate; @@ -537,10 +535,10 @@ curcol = opponent_color(curcol); } while (running); - post_game(settings, &gamestate); + game_review(settings, &gamestate); } -void game_continue(Settings *settings, int opponent, GameState *gamestate) { +void game_play(Settings *settings, GameState *gamestate, int opponent) { inputy = getmaxy(stdscr) - 6; uint8_t mycolor = is_server(settings) ? settings->gameinfo.servercolor : @@ -561,15 +559,6 @@ } myturn ^= true; } while (running); - - post_game(settings, gamestate); -} - -void game_start(Settings *settings, int opponent) { - GameState gamestate; - gamestate_init(&gamestate); - - game_continue(settings, opponent, &gamestate); } void dump_gameinfo(GameInfo *gameinfo) { diff -r e75865d90111 -r ead00609e5e6 src/game.h --- a/src/game.h Thu Jun 05 19:05:02 2025 +0200 +++ b/src/game.h Fri Jun 06 19:19:14 2025 +0200 @@ -49,9 +49,10 @@ #define is_server(settings) !((settings)->serverhost) -void game_start(Settings *settings, int opponent); -void game_continue(Settings *settings, int opponent, GameState *gamestate); -void game_start_singlemachine(Settings *settings); +void game_play_singlemachine(Settings *settings); + +void game_play(Settings *settings, GameState *gamestate, int opponent); +void game_review(Settings* settings, GameState *gamestate); int server_run(Settings* settings); int client_run(Settings* settings); diff -r e75865d90111 -r ead00609e5e6 src/main.c --- a/src/main.c Thu Jun 05 19:05:02 2025 +0200 +++ b/src/main.c Fri Jun 06 19:19:14 2025 +0200 @@ -186,7 +186,7 @@ int exitcode; if (settings.singlemachine) { - game_start_singlemachine(&settings); + game_play_singlemachine(&settings); exitcode = EXIT_SUCCESS; } else if (settings.analyzepgn) { printw("Not implemented yet.\n"); diff -r e75865d90111 -r ead00609e5e6 src/server.c --- a/src/server.c Thu Jun 05 19:05:02 2025 +0200 +++ b/src/server.c Fri Jun 06 19:19:14 2025 +0200 @@ -69,13 +69,13 @@ Server server; dump_gameinfo(&(settings->gameinfo)); - GameState continuegame; - gamestate_init(&continuegame); + GameState gamestate; + gamestate_init(&gamestate); if (settings->continuepgn) { /* preload PGN data before handshake */ FILE *pgnfile = fopen(settings->continuepgn, "r"); if (pgnfile) { - int result = read_pgn(pgnfile, &continuegame, + int result = read_pgn(pgnfile, &gamestate, &(settings->gameinfo)); long position = ftell(pgnfile); fclose(pgnfile); @@ -84,12 +84,12 @@ position, pgn_error_str(result)); return 1; } - if (!is_game_running(&continuegame)) { + if (!is_game_running(&gamestate)) { addstr("Game has ended. Use -S to analyze it.\n"); return 1; } addch('\n'); - dump_moveinfo(&continuegame); + dump_moveinfo(&gamestate); addch('\n'); } else { printw("Can't read PGN file (%s)\n", strerror(errno)); @@ -111,7 +111,7 @@ if (settings->continuepgn) { /* Continue game, send PGN data */ uint16_t mc = 0; - MoveList *movelist = continuegame.movelist; + MoveList *movelist = gamestate.movelist; while (movelist) { mc++; movelist = movelist->next; @@ -119,7 +119,7 @@ Move* moves = calloc(mc, sizeof(Move)); - movelist = continuegame.movelist; + movelist = gamestate.movelist; mc = 0; while (movelist) { moves[mc] = movelist->move; @@ -146,17 +146,20 @@ if (code == NETCODE_ACCEPT) { addstr("\rClient connected - challenge accepted."); clrtoeol(); - if (settings->continuepgn) { - game_continue(settings, fd, &continuegame); - } else { - game_start(settings, fd); - } + game_play(settings, &gamestate, fd); + net_destroy(&server); + game_review(settings, &gamestate); + return 0; } else if (code == NETCODE_DECLINE) { addstr("\rClient connected - challenge declined."); clrtoeol(); + net_destroy(&server); + return 0; } else if (code == NETCODE_CONNLOST) { addstr("\rClient connected - but gave no response."); clrtoeol(); + net_destroy(&server); + return 0; } else { addstr("\rInvalid client response"); clrtoeol(); @@ -164,7 +167,4 @@ net_destroy(&server); return 1; } - - net_destroy(&server); - return 0; }