skip_wrong_letter is now a toggle
This commit is contained in:
parent
d98f749f3b
commit
733318c036
@ -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:
|
||||||
|
@ -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];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user