diff -r 6da16865a270 -r e57e2874fb2a src/main.c --- a/src/main.c Mon Aug 24 15:48:19 2026 +0200 +++ b/src/main.c Mon Aug 24 16:13:51 2026 +0200 @@ -552,6 +552,7 @@ size_t bufpos = 0; char movestr[MOVESTR_BUFLEN]; + bool remis_offered = false; bool remis_rejected = false; bool remis_suggested = false; bool resign_suggested = false; @@ -585,6 +586,8 @@ printw("The opponent offers remis. Type remis to accept. \n\n"); } else if (remis_rejected) { printw("Remis offer rejected. \n\n"); + } else if (remis_offered) { + printw("Remis offer sent. \n\n"); } else { printw("Or use a command: remis, resign, savepgn \n\n"); } @@ -595,6 +598,10 @@ code = net_recieve_code_async(opponent); switch (code) { case NETCODE_REMIS: + if (remis_offered) { + gamestate->remis = true; + return 1; + } remis_suggested = true; break; case NETCODE_TAUNT: @@ -642,19 +649,9 @@ return 1; } if (!remis_rejected) { net_send_code(opponent, NETCODE_REMIS); - printw("Remis offer sent - waiting for acceptance..."); - refresh(); - code = net_recieve_code(opponent); - if (code == NETCODE_ACCEPT) { - gamestate->remis = true; - return 1; - } else if (code == NETCODE_CONNLOST) { - gamestate->ragequit = true; - return 1; - } else { - remis_rejected = true; - } + remis_offered = true; } + /* prevent spamming the remis message */ } else if (movestr[0] == 0) { /* ignore empty move strings and ask again */ } else { @@ -703,25 +700,31 @@ size_t bufpos = 0; char movestr[MOVESTR_BUFLEN]; - bool remis_suggested = false, resign_suggested = false; + bool remis_suggested = false, remis_offered = false; + bool resign_suggested = false; while (1) { timecontrol(gamestate); move(inputy, 0); printw("Waiting for opponent. Use chess notation to prepare a move.\n"); if (*gamestate->premove) { - printw("Current pre-move: %s \n\n", + printw("Current pre-move: %s \n", gamestate->premove); } else if (remis_suggested && !resign_suggested) { - printw("Suggested remis. \n\n"); + printw("Suggested remis. \n"); } else if (resign_suggested) { if (remis_suggested) { - printw("Suggested to resign or at least to accept remis. \n\n"); + printw("Suggested to resign or at least to accept remis. \n"); } else { - printw("Suggested to resign. \n\n"); + printw("Suggested to resign. \n"); } } else { - printw("Or use a command: remis, resign, taunt, savepgn \n\n"); + printw("Or use a command: remis, resign, taunt, savepgn \n"); + } + if (remis_offered) { + printw("Opponent offered remis. Type 'remis' to accept.\n"); + } else { + printw("\n"); } printw("Prepare your next move: "); clrtoeol(); @@ -741,8 +744,13 @@ resign_suggested = true; net_send_code(opponent, NETCODE_TAUNT); } else if (strncmp(movestr, "remis", MOVESTR_BUFLEN) == 0) { - remis_suggested = true; net_send_code(opponent, NETCODE_REMIS); + if (remis_offered) { + gamestate->remis = true; + return 1; + } else { + remis_suggested = true; + } } else if (strncmp(movestr, "savepgn", MOVESTR_BUFLEN) == 0) { save_pgn(gamestate); } else if (movestr[0] == 0) { @@ -782,14 +790,7 @@ gamestate->remis = true; return 1; } else { - if (prompt_yesno( - "\rYour opponent offers remis - do you accept")) { - gamestate->remis = true; - net_send_code(opponent, NETCODE_ACCEPT); - return 1; - } else { - net_send_code(opponent, NETCODE_DECLINE); - } + remis_offered = true; } break; /* validate "the game has ended" claims */