From 73f403693a80d3568c7859083f764db40b7b6519 Mon Sep 17 00:00:00 2001 From: adam Date: Tue, 29 Sep 2026 17:17:20 +0000 Subject: [PATCH] save progress after every guess Progress was only saved at the start of a game and on Ctrl-C, so a dropped connection lost every guess made so far. Ctrl-C during the reveal also saved the scored row without advancing ROW, which gave the player that guess back on resume. Save straight after each guess is scored (before the reveal) with the next row, record the result before the final reveal, and make the SIGINT trap only tidy up the terminal. Co-Authored-By: Claude Opus 5.5 --- wordle | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/wordle b/wordle index db6ec40..f11ac31 100755 --- a/wordle +++ b/wordle @@ -51,7 +51,7 @@ function main() { init_board fi - [[ "${ONLINE}" == 1 ]] && save_game "NO_EXIT" + [[ "${ONLINE}" == 1 ]] && save_game "${ROW}" render_board @@ -61,10 +61,16 @@ function main() { GUESS=$(retrieve_guess) check_guess "${GUESS}" "${ROW}" ; WIN=$? + # Save before the reveal so quitting or disconnecting can't undo a guess + if [[ $WIN == 5 ]] || (( ROW+1 == HEIGHT )); then + save_result + elif [[ "${ONLINE}" == 1 ]]; then + save_game "$(( ROW+1 ))" + fi + reveal_row "${ROW}" if [[ $WIN == 5 ]]; then - save_result echo -e "${CLEAR_DOWN}YOU WIN" if [[ "${ONLINE}" == 1 && "${DAILY_DONE}" != 1 ]]; then echo "Share/view your game with -> curl \"${URL_BASE}/${RESULT_FILE}\"" @@ -84,8 +90,7 @@ function main() { done echo -en "${NEWLINE}${RESET}" - save_result - if [[ "${ONLINE}" == 1 && "${DAILY_DONE}" != 1 ]]; then + if [[ "${ONLINE}" == 1 && "${DAILY_DONE}" != 1 ]]; then echo "Share/view your game with -> curl \"${URL_BASE}/${RESULT_FILE}\"" echo "Share/view your stats with -> curl \"${URL_BASE}/stats/${USER}\"" echo "Check out the new homepage in your browser -> ${URL_BASE}" @@ -182,7 +187,8 @@ function set_options() { fi fi - trap save_game SIGINT + # Progress is saved after every guess so Ctrl-C only needs to tidy the terminal + trap 'echo -en "${SHOW_CURSOR}${RESET}"; exit 0' SIGINT ;; d) DELAY=0 @@ -386,8 +392,9 @@ function load_game() { source "${PROGRESS_FILE}" } -# shellcheck disable=SC2317 # Don't warn about unreachable commands in this function +# Takes the row the game should resume from function save_game() { + declare -r row=$1 : > "${PROGRESS_FILE}" for key in "${!BOARD[@]}"; do @@ -403,18 +410,15 @@ function save_game() { done { - echo "ROW=${ROW}" + echo "ROW=${row}" echo "POOL=${POOL}" echo "HARD_MODE=${HARD_MODE}" echo "STRICT_HARD_MODE=${STRICT_HARD_MODE}" echo "WIN=${WIN}" echo "ANSWER=${ANSWER}" echo "IN_PROGRESS=1" - [[ "${PLAYED}" == 1 ]] && echo 'PLAYED=1' + [[ "${PLAYED}" == 1 ]] && echo 'PLAYED=1' } >> "${PROGRESS_FILE}" - - echo -en "${RESET}" - [[ -z $1 ]] && exit 0 } function save_result() {