]> git.earman.xyz Git - sensor-watch.git/commitdiff
Display of face cards and Ace
authorDavid Volovskiy <devolov@gmail.com>
Wed, 3 Sep 2025 11:28:38 +0000 (07:28 -0400)
committerDavid Volovskiy <devolov@gmail.com>
Wed, 3 Sep 2025 11:28:38 +0000 (07:28 -0400)
watch-faces/complication/blackjack_face.c

index beb14446aefd82bc629f3d7bf9b43dd7016651e1..ee49042607ae0171753ad068a7ad7fa11dc67604 100755 (executable)
@@ -61,6 +61,10 @@ typedef enum {
     BJ_RESULT,\r
 } game_state_t;\r
 \r
+typedef enum {\r
+    A, B, C, D, E, F, G\r
+} segment_t;\r
+\r
 static game_state_t game_state;\r
 static uint8_t deck[DECK_SIZE] = {0};\r
 static uint8_t current_card = 0;\r
@@ -106,22 +110,23 @@ static void reset_deck(void) {
 static uint8_t get_next_card(hand_info_t *hand_info) {\r
     if (current_card >= DECK_SIZE)\r
         reset_deck();\r
-    uint8_t card = deck[current_card++];\r
+    return deck[current_card++];\r
+}\r
+\r
+static uint8_t get_card_value(uint8_t card) {\r
+    uint8_t card_value;\r
     switch (card)\r
     {\r
     case ACE:\r
-        card = 11;\r
-        hand_info->high_aces_in_hand++;\r
+        return 11;\r
         break;\r
     case KING:\r
     case QUEEN:\r
     case JACK:\r
         card = 10;\r
-    \r
     default:\r
-        break;\r
+        return card;\r
     }\r
-    return card;\r
 }\r
 \r
 static void modify_score_from_aces(hand_info_t *hand_info) {\r
@@ -139,64 +144,95 @@ static void reset_hands(void) {
 \r
 static void give_card(hand_info_t *hand_info) {\r
     uint8_t card = get_next_card(hand_info);\r
+    if (card == ACE) hand_info->high_aces_in_hand++;\r
     hand_info->hand[hand_info->idx_hand++] = card;\r
-    hand_info->score += card;\r
+    uint8_t card_value = get_card_value(card);\r
+    hand_info->score += card_value;\r
     modify_score_from_aces(hand_info);\r
 }\r
 \r
+static void set_segment_at_position(segment_t segment, uint8_t position) {\r
+    digit_mapping_t segmap;\r
+    if (watch_get_lcd_type() == WATCH_LCD_TYPE_CUSTOM) {\r
+        segmap = Custom_LCD_Display_Mapping[position];\r
+    } else {\r
+        segmap = Classic_LCD_Display_Mapping[position];\r
+    }\r
+    const uint8_t com_pin = segmap.segment[segment].address.com;\r
+    const uint8_t seg = segmap.segment[segment].address.seg;\r
+    watch_set_pixel(com_pin, seg);\r
+}\r
+\r
+static void display_card_at_position(uint8_t card, uint8_t display_position) {\r
+    switch (card) {\r
+        case KING:\r
+            watch_display_character(' ', display_position);\r
+            set_segment_at_position(A, display_position);\r
+            set_segment_at_position(D, display_position);\r
+            set_segment_at_position(G, display_position);\r
+            break;\r
+        case QUEEN:\r
+            watch_display_character(' ', display_position);\r
+            set_segment_at_position(A, display_position);\r
+            set_segment_at_position(D, display_position);\r
+            break;\r
+        case JACK:\r
+            watch_display_character('-', display_position);\r
+            break;\r
+        case ACE:\r
+            watch_display_character('A', display_position);\r
+            break;\r
+        default: {\r
+            const char display_char = card + '0';\r
+            watch_display_character(display_char, display_position);\r
+            break;\r
+        }\r
+    }\r
+}\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
-        if (card == 10) card = 0;\r
-        const char display_char = card + '0';\r
-        watch_display_character(display_char, BOARD_DISPLAY_START + cards_to_display - i);\r
+        display_card_at_position(card, BOARD_DISPLAY_START + cards_to_display - i);\r
     }\r
 }\r
 \r
 static void display_dealer_hand(void) {\r
     uint8_t card = dealer.hand[dealer.idx_hand - 1];\r
-    if (card == 10) card = 0;\r
-    const char display_char = card + '0';\r
-    watch_display_character(display_char, 0);\r
-}\r
-\r
-static void display_player_score(void) {\r
-    char buf[4];\r
-    sprintf(buf, "%2d", player.score);\r
-    watch_display_text(WATCH_POSITION_SECONDS, buf);\r
+    display_card_at_position(card, 0);\r
 }\r
 \r
-static void display_dealer_score(void) {\r
+display_score(uint8_t score, watch_position_t pos) {\r
     char buf[4];\r
-    sprintf(buf, "%2d", dealer.score);\r
-    watch_display_text(WATCH_POSITION_TOP_RIGHT, buf);\r
+    sprintf(buf, "%2d", score);\r
+    watch_display_text(pos, buf);\r
 }\r
 \r
 static void display_win(void) {\r
     game_state = BJ_RESULT;\r
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "WlN ", " WIN");\r
-    display_player_score();\r
-    display_dealer_score();\r
+    display_score(player.score, WATCH_POSITION_SECONDS);\r
+    display_score(dealer.score, WATCH_POSITION_TOP_RIGHT);\r
 }\r
 \r
 static void display_lose(void) {\r
     game_state = BJ_RESULT;\r
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "LOSE", "lOSE");\r
-    display_player_score();\r
-    display_dealer_score();\r
+    display_score(player.score, WATCH_POSITION_SECONDS);\r
+    display_score(dealer.score, WATCH_POSITION_TOP_RIGHT);\r
 }\r
 \r
 static void display_tie(void) {\r
     game_state = BJ_RESULT;\r
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "TlE ", " TIE");\r
-    display_player_score();\r
+    display_score(player.score, WATCH_POSITION_SECONDS);\r
 }\r
 \r
 static void display_bust(void) {\r
     game_state = BJ_RESULT;\r
     watch_display_text_with_fallback(WATCH_POSITION_BOTTOM, "8UST ", " BUST");\r
-    display_player_score();\r
+    display_score(player.score, WATCH_POSITION_SECONDS);\r
 }\r
 \r
 static void display_title(void) {\r
@@ -213,10 +249,10 @@ static void begin_playing(void) {
     give_card(&player);\r
     give_card(&player);\r
     display_player_hand();\r
-    display_player_score();\r
+    display_score(player.score, WATCH_POSITION_SECONDS);\r
     give_card(&dealer);\r
     display_dealer_hand();\r
-    display_dealer_score();\r
+    display_score(dealer.score, WATCH_POSITION_TOP_RIGHT);\r
 }\r
 \r
 static void perform_hit(void) {\r
@@ -228,14 +264,14 @@ static void perform_hit(void) {
         display_bust();\r
     } else {\r
         display_player_hand();\r
-        display_player_score();\r
+        display_score(player.score, WATCH_POSITION_SECONDS);\r
     }\r
 }\r
 \r
 static void perform_stand(void) {\r
     game_state = BJ_DEALER_PLAYING;\r
     watch_display_text(WATCH_POSITION_BOTTOM, "Stnd");\r
-    display_player_score();\r
+    display_score(player.score, WATCH_POSITION_SECONDS);\r
 }\r
 \r
 static void dealer_performs_hits(void) {\r
@@ -247,7 +283,7 @@ static void dealer_performs_hits(void) {
         display_lose();\r
     } else {\r
         display_dealer_hand();\r
-        display_dealer_score();\r
+        display_score(dealer.score, WATCH_POSITION_TOP_RIGHT);\r
     } \r
 }\r
 \r