]> git.earman.xyz Git - sensor-watch.git/commitdiff
Added Win percentage face
authorDavid Volovskiy <devolov@gmail.com>
Wed, 3 Sep 2025 22:18:03 +0000 (18:18 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Wed, 3 Sep 2025 22:18:03 +0000 (18:18 -0400)
watch-faces/complication/blackjack_face.c
watch-faces/complication/blackjack_face.h

index 1497b7d6578d502562aa8fafb566c3ecde0a65bd..3d549dcae4ef0b0b7940d77c97066d0477a84b7b 100755 (executable)
@@ -60,6 +60,7 @@ typedef enum {
     BJ_DEALER_PLAYING,\r
     BJ_BUST,\r
     BJ_RESULT,\r
+    BJ_WIN_RATIO,\r
 } game_state_t;\r
 \r
 typedef enum {\r
@@ -69,6 +70,8 @@ typedef enum {
 static game_state_t game_state;\r
 static uint8_t deck[DECK_SIZE] = {0};\r
 static uint8_t current_card = 0;\r
+static bool add_to_games_played = false;\r
+static bool add_to_games_won = false;\r
 hand_info_t player;\r
 hand_info_t dealer;\r
 \r
@@ -193,10 +196,15 @@ static void display_card_at_position(uint8_t card, uint8_t display_position) {
 }\r
 \r
 static void display_player_hand(void) { \r
-    uint8_t cards_to_display = player.idx_hand > MAX_PLAYER_CARDS_DISPLAY ? MAX_PLAYER_CARDS_DISPLAY : player.idx_hand;\r
-    for (uint8_t i=cards_to_display; i>0; i--) {\r
-        uint8_t card = player.hand[player.idx_hand-i];\r
-        display_card_at_position(card, BOARD_DISPLAY_START + cards_to_display - i);\r
+    uint8_t card;\r
+    if (player.idx_hand <= MAX_PLAYER_CARDS_DISPLAY) {\r
+        card = player.hand[player.idx_hand - 1];\r
+        display_card_at_position(card, BOARD_DISPLAY_START + player.idx_hand - 1);\r
+    } else {\r
+        for (uint8_t i=0; i<MAX_PLAYER_CARDS_DISPLAY; i++) {\r
+            card = player.hand[player.idx_hand - MAX_PLAYER_CARDS_DISPLAY + i];\r
+            display_card_at_position(card, BOARD_DISPLAY_START + i);\r
+        }\r
     }\r
 }\r
 \r
@@ -213,6 +221,8 @@ static void display_score(uint8_t score, watch_position_t pos) {
 \r
 static void display_win(void) {\r
     game_state = BJ_RESULT;\r
+    add_to_games_played = true;\r
+    add_to_games_won = true;\r
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "WlN ", " WIN");\r
     display_score(player.score, WATCH_POSITION_SECONDS);\r
     display_score(dealer.score, WATCH_POSITION_TOP_RIGHT);\r
@@ -220,6 +230,7 @@ static void display_win(void) {
 \r
 static void display_lose(void) {\r
     game_state = BJ_RESULT;\r
+    add_to_games_played = true;\r
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "LOSE", "lOSE");\r
     display_score(player.score, WATCH_POSITION_SECONDS);\r
     display_score(dealer.score, WATCH_POSITION_TOP_RIGHT);\r
@@ -227,12 +238,14 @@ static void display_lose(void) {
 \r
 static void display_tie(void) {\r
     game_state = BJ_RESULT;\r
+    // Don't record ties to the win ratio\r
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "TlE ", " TIE");\r
     display_score(player.score, WATCH_POSITION_SECONDS);\r
 }\r
 \r
 static void display_bust(void) {\r
     game_state = BJ_RESULT;\r
+    add_to_games_played = true;\r
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "8UST ", " BUST");\r
 }\r
 \r
@@ -242,6 +255,18 @@ static void display_title(void) {
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, " JACK ", "BLaKJK");\r
 }\r
 \r
+static void display_win_ratio(blackjack_face_state_t *state) {\r
+    char buf[7];\r
+    game_state = BJ_WIN_RATIO;\r
+    uint8_t win_ratio = 0;\r
+    if (state->games_played > 0) {  // Avoid dividing by zero\r
+        win_ratio = (uint8_t)(100 * state->games_won) / state->games_played;\r
+    }\r
+    watch_display_text_with_fallback(WATCH_POSITION_TOP, "WINS  ", "WR  ");\r
+    sprintf(buf, "%3dPct", win_ratio);\r
+    watch_display_text(WATCH_POSITION_BOTTOM, buf);\r
+}\r
+\r
 static void begin_playing(bool tap_control_on) {\r
     watch_clear_display();\r
     if (tap_control_on) {\r
@@ -251,6 +276,7 @@ static void begin_playing(bool tap_control_on) {
     reset_hands();\r
     // Give player their first 2 cards\r
     give_card(&player);\r
+    display_player_hand();\r
     give_card(&player);\r
     display_player_hand();\r
     display_score(player.score, WATCH_POSITION_SECONDS);\r
@@ -304,6 +330,25 @@ static void see_if_dealer_hits(void) {
     }\r
 }\r
 \r
+static void add_to_game_scores(blackjack_face_state_t *state) {\r
+    if (add_to_games_played) {\r
+        add_to_games_played = false;\r
+        state->games_played++;\r
+        if (state->games_played == 0) {\r
+            // Overflow\r
+            state->games_won = 0;\r
+        }\r
+    }\r
+    if (add_to_games_won) {\r
+        add_to_games_won = false;\r
+        state->games_won++;\r
+        if (state->games_won == 0) {\r
+            // Overflow\r
+            state->games_played = 0;\r
+        }\r
+    }\r
+}\r
+\r
 static void handle_button_presses(bool tap_control_on, bool hit) {\r
     switch (game_state)\r
     {\r
@@ -324,6 +369,7 @@ static void handle_button_presses(bool tap_control_on, bool hit) {
         display_bust();\r
         break;\r
     case BJ_RESULT:\r
+    case BJ_WIN_RATIO:\r
         display_title();\r
         break;\r
     }\r
@@ -362,6 +408,9 @@ void blackjack_face_activate(void *context) {
 \r
 bool blackjack_face_loop(movement_event_t event, void *context) {\r
     blackjack_face_state_t *state = (blackjack_face_state_t *) context;\r
+    if (game_state == BJ_RESULT) {\r
+        add_to_game_scores(state);\r
+    }\r
     switch (event.event_type) {\r
         case EVENT_ACTIVATE:\r
             if (state->tap_control_on) {\r
@@ -390,6 +439,11 @@ bool blackjack_face_loop(movement_event_t event, void *context) {
         case EVENT_SINGLE_TAP:\r
             handle_button_presses(state->tap_control_on, true);\r
             break;\r
+        case EVENT_LIGHT_LONG_PRESS:\r
+            if (game_state == BJ_TITLE_SCREEN) {\r
+                display_win_ratio(state);\r
+            }\r
+            break;\r
         case EVENT_ALARM_LONG_PRESS:\r
             if (game_state == BJ_TITLE_SCREEN) {\r
                 toggle_tap_control(state);\r
index 84041517f61e0afec766dd3c7a3ba5ceed61342f..c93143b94ed3f14b25ffc321136af0286b640304 100755 (executable)
@@ -71,6 +71,8 @@
 \r
 typedef struct {\r
     bool tap_control_on;\r
+    uint16_t games_played;\r
+    uint16_t games_won;\r
 } blackjack_face_state_t;\r
 \r
 void blackjack_face_setup(uint8_t watch_face_index, void ** context_ptr);\r