]> git.earman.xyz Git - sensor-watch.git/commitdiff
skip_wrong_letter is now a toggle
authorDavid Volovskiy <devolov@gmail.com>
Sun, 25 Aug 2024 16:18:27 +0000 (12:18 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Tue, 3 Sep 2024 20:11:54 +0000 (16:11 -0400)
movement/watch_faces/complication/wordle_face.c
movement/watch_faces/complication/wordle_face.h

index 945bb76f2bae8a2fde75558f16ad100876a2cb5d..608fbe56e8689c98574fd6bd1cac010e3887c515 100644 (file)
@@ -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:
index 7071c79b7a9b83054a2c3c0a26732a7ea2d25a69..d1c1a54c2a1b167c9d7abb759fc889a2b258204c 100644 (file)
@@ -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];