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
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
\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
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
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
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