fix that network connection is still open during game review

Fri, 06 Jun 2025 19:19:14 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 06 Jun 2025 19:19:14 +0200
changeset 83
ead00609e5e6
parent 82
e75865d90111
child 84
df47b7efb97d

fix that network connection is still open during game review

src/client.c file | annotate | diff | comparison | revisions
src/game.c file | annotate | diff | comparison | revisions
src/game.h file | annotate | diff | comparison | revisions
src/main.c file | annotate | diff | comparison | revisions
src/server.c file | annotate | diff | comparison | revisions
--- 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;
 }
--- 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) {
--- 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);
--- 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");
--- 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;
 }

mercurial