skip_wrong_letter is now a toggle

This commit is contained in:
David Volovskiy 2024-08-25 12:18:27 -04:00
parent d98f749f3b
commit 733318c036
2 changed files with 31 additions and 13 deletions

View File

@ -62,18 +62,18 @@ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_
return curr_pos; 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 { do {
if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = 0; 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; 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 { do {
if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = WORDLE_NUM_VALID_LETTERS - 1; 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; 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) { 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; 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) { static void update_known_wrong_letters(wordle_state_t *state) {
#if WORDLE_SKIP_WRONG_LETTERS
for (size_t i = 0; i < WORDLE_LENGTH; i++) { for (size_t i = 0; i < WORDLE_LENGTH; i++) {
if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) { if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) {
for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { 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) { 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) { 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_attempt(state->attempt);
display_all_letters(state); display_all_letters(state);
state->curr_screen = SCREEN_PLAYING;
} }
static void reset_all_elements(wordle_state_t *state) { 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) { static void display_title(wordle_state_t *state) {
state->curr_screen = SCREEN_TITLE; state->curr_screen = SCREEN_TITLE;
show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen);
watch_display_string("WO WordLE", 0); 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) { static void display_continue(wordle_state_t *state) {
state->curr_screen = SCREEN_CONTINUE; state->curr_screen = SCREEN_CONTINUE;
show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen);
watch_display_string("Cont ", 4); watch_display_string("Cont ", 4);
display_continue_result(state->continuing); 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) { static void display_streak(wordle_state_t *state) {
char buf[12]; char buf[12];
state->curr_screen = SCREEN_STREAK; state->curr_screen = SCREEN_STREAK;
show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen);
#if WORDLE_USE_DAILY_STREAK #if WORDLE_USE_DAILY_STREAK
if (state->streak > 99) if (state->streak > 99)
sprintf(buf, "WO St--dy"); sprintf(buf, "WO St--dy");
@ -262,6 +271,7 @@ static void display_streak(wordle_state_t *state) {
#if WORDLE_USE_DAILY_STREAK #if WORDLE_USE_DAILY_STREAK
static void display_wait(wordle_state_t *state) { static void display_wait(wordle_state_t *state) {
state->curr_screen = SCREEN_WAIT; state->curr_screen = SCREEN_WAIT;
show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen);
if (state->streak < 40) { if (state->streak < 40) {
char buf[13]; char buf[13];
sprintf(buf,"WO%2d WaIt ", state->streak); 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) { static void display_lose(wordle_state_t *state, uint8_t subsecond) {
char buf[WORDLE_LENGTH + 6]; 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] : " "); sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " ");
watch_display_string(buf, 0); 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) { static void display_win(wordle_state_t *state, uint8_t subsecond) {
(void) state; (void) state;
char buf[13]; char buf[13];
show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen);
sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb ");
watch_display_string(buf, 0); watch_display_string(buf, 0);
} }
@ -322,6 +334,7 @@ static void display_result(wordle_state_t *state, uint8_t subsecond) {
break; break;
} }
} }
show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen);
watch_display_string(buf, 5); 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)); memset(*context_ptr, 0, sizeof(wordle_state_t));
wordle_state_t *state = (wordle_state_t *)*context_ptr; wordle_state_t *state = (wordle_state_t *)*context_ptr;
state->curr_screen = SCREEN_TITLE; state->curr_screen = SCREEN_TITLE;
state->skip_wrong_letter = false;
reset_all_elements(state); reset_all_elements(state);
} }
// Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep. // 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; break;
case EVENT_LIGHT_BUTTON_UP: case EVENT_LIGHT_BUTTON_UP:
if (act_on_btn(state, BTN_LIGHT)) break; 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); display_letter(state, true);
break; break;
case EVENT_LIGHT_LONG_PRESS: 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; 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); display_letter(state, true);
break; break;
case EVENT_ALARM_BUTTON_UP: case EVENT_ALARM_BUTTON_UP:

View File

@ -64,7 +64,6 @@
#define WORDLE_MAX_ATTEMPTS 6 #define WORDLE_MAX_ATTEMPTS 6
#define WORDLE_USE_DAILY_STREAK false #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_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 /* WORDLE_USE_RANDOM_GUESS
* 0 = Don't allow quickly choosing a random quess * 0 = Don't allow quickly choosing a random quess
* 1 = Allow using a random guess of any value that can be an answer * 1 = Allow using a random guess of any value that can be an answer
@ -85,13 +84,13 @@ typedef enum {
} WordleLetterResult; } WordleLetterResult;
typedef enum { typedef enum {
SCREEN_PLAYING = 0, SCREEN_TITLE = 0,
SCREEN_TITLE,
SCREEN_STREAK, SCREEN_STREAK,
SCREEN_CONTINUE, SCREEN_CONTINUE,
#if WORDLE_USE_DAILY_STREAK #if WORDLE_USE_DAILY_STREAK
SCREEN_WAIT, SCREEN_WAIT,
#endif #endif
SCREEN_PLAYING,
SCREEN_RESULT, SCREEN_RESULT,
SCREEN_WIN, SCREEN_WIN,
SCREEN_LOSE, SCREEN_LOSE,
@ -110,8 +109,9 @@ typedef struct {
uint8_t attempt : 4; uint8_t attempt : 4;
uint8_t position : 3; uint8_t position : 3;
bool using_random_guess : 1; bool using_random_guess : 1;
uint16_t curr_answer : 15; uint16_t curr_answer : 14;
bool continuing : 1; bool continuing : 1;
bool skip_wrong_letter : 1;
uint8_t streak; uint8_t streak;
WordleScreen curr_screen; WordleScreen curr_screen;
bool known_wrong_letters[WORDLE_NUM_VALID_LETTERS]; bool known_wrong_letters[WORDLE_NUM_VALID_LETTERS];