diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 945bb76f..608fbe56 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -62,18 +62,18 @@ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_ return curr_pos; } -static void get_next_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) { +static void get_next_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters, const bool skip_wrong_letter) { do { if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = 0; else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % WORDLE_NUM_VALID_LETTERS; - } while (known_wrong_letters[word_elements[curr_pos]]); + } while (skip_wrong_letter && known_wrong_letters[word_elements[curr_pos]]); } -static void get_prev_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) { +static void get_prev_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters, const bool skip_wrong_letter) { do { if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = WORDLE_NUM_VALID_LETTERS - 1; else word_elements[curr_pos] = (word_elements[curr_pos] + WORDLE_NUM_VALID_LETTERS - 1) % WORDLE_NUM_VALID_LETTERS; - } while (known_wrong_letters[word_elements[curr_pos]]); + } while (skip_wrong_letter && known_wrong_letters[word_elements[curr_pos]]); } static void display_letter(wordle_state_t *state, bool display_dash) { @@ -166,8 +166,14 @@ static bool check_word(wordle_state_t *state) { return false; } +static void show_skip_wrong_letter_indicator(bool skipping, WordleScreen curr_screen) { + if (skipping && curr_screen <= SCREEN_CONTINUE) + watch_set_indicator(WATCH_INDICATOR_LAP); + else + watch_clear_indicator(WATCH_INDICATOR_LAP); +} + static void update_known_wrong_letters(wordle_state_t *state) { -#if WORDLE_SKIP_WRONG_LETTERS for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) { for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { @@ -176,7 +182,6 @@ static void update_known_wrong_letters(wordle_state_t *state) { } } } -#endif } static void display_attempt(uint8_t attempt) { @@ -186,9 +191,10 @@ static void display_attempt(uint8_t attempt) { } static void display_playing(wordle_state_t *state) { + state->curr_screen = SCREEN_PLAYING; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); display_attempt(state->attempt); display_all_letters(state); - state->curr_screen = SCREEN_PLAYING; } static void reset_all_elements(wordle_state_t *state) { @@ -229,6 +235,7 @@ static void reset_board(wordle_state_t *state) { static void display_title(wordle_state_t *state) { state->curr_screen = SCREEN_TITLE; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("WO WordLE", 0); } @@ -239,6 +246,7 @@ static void display_continue_result(bool continuing) { static void display_continue(wordle_state_t *state) { state->curr_screen = SCREEN_CONTINUE; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("Cont ", 4); display_continue_result(state->continuing); } @@ -247,6 +255,7 @@ static void display_continue(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); #if WORDLE_USE_DAILY_STREAK if (state->streak > 99) sprintf(buf, "WO St--dy"); @@ -262,6 +271,7 @@ static void display_streak(wordle_state_t *state) { #if WORDLE_USE_DAILY_STREAK static void display_wait(wordle_state_t *state) { state->curr_screen = SCREEN_WAIT; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); if (state->streak < 40) { char buf[13]; sprintf(buf,"WO%2d WaIt ", state->streak); @@ -281,6 +291,7 @@ static uint32_t get_day_unix_time(void) { static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " "); watch_display_string(buf, 0); } @@ -288,6 +299,7 @@ static void display_lose(wordle_state_t *state, uint8_t subsecond) { static void display_win(wordle_state_t *state, uint8_t subsecond) { (void) state; char buf[13]; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); watch_display_string(buf, 0); } @@ -322,6 +334,7 @@ static void display_result(wordle_state_t *state, uint8_t subsecond) { break; } } + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string(buf, 5); } @@ -464,6 +477,7 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, memset(*context_ptr, 0, sizeof(wordle_state_t)); wordle_state_t *state = (wordle_state_t *)*context_ptr; state->curr_screen = SCREEN_TITLE; + state->skip_wrong_letter = false; reset_all_elements(state); } // Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep. @@ -515,12 +529,16 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; case EVENT_LIGHT_BUTTON_UP: if (act_on_btn(state, BTN_LIGHT)) break; - get_next_letter(state->position, state->word_elements, state->known_wrong_letters); + get_next_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); display_letter(state, true); break; case EVENT_LIGHT_LONG_PRESS: + if (state->curr_screen <= SCREEN_CONTINUE) { + state->skip_wrong_letter = !state->skip_wrong_letter; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); + } if (state->curr_screen != SCREEN_PLAYING) break; - get_prev_letter(state->position, state->word_elements, state->known_wrong_letters); + get_prev_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); display_letter(state, true); break; case EVENT_ALARM_BUTTON_UP: diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 7071c79b..d1c1a54c 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -64,7 +64,6 @@ #define WORDLE_MAX_ATTEMPTS 6 #define WORDLE_USE_DAILY_STREAK false #define WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. -#define WORDLE_SKIP_WRONG_LETTERS true // If true, already guessed letters that are known to be wrong will be skipped when cycling /* WORDLE_USE_RANDOM_GUESS * 0 = Don't allow quickly choosing a random quess * 1 = Allow using a random guess of any value that can be an answer @@ -85,13 +84,13 @@ typedef enum { } WordleLetterResult; typedef enum { - SCREEN_PLAYING = 0, - SCREEN_TITLE, + SCREEN_TITLE = 0, SCREEN_STREAK, SCREEN_CONTINUE, #if WORDLE_USE_DAILY_STREAK SCREEN_WAIT, #endif + SCREEN_PLAYING, SCREEN_RESULT, SCREEN_WIN, SCREEN_LOSE, @@ -110,8 +109,9 @@ typedef struct { uint8_t attempt : 4; uint8_t position : 3; bool using_random_guess : 1; - uint16_t curr_answer : 15; + uint16_t curr_answer : 14; bool continuing : 1; + bool skip_wrong_letter : 1; uint8_t streak; WordleScreen curr_screen; bool known_wrong_letters[WORDLE_NUM_VALID_LETTERS];