ui.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include <math.h>
  2. #include <notification/notification_messages.h>
  3. #include "ui.h"
  4. #define LINE_HEIGHT 16
  5. #define ITEM_PADDING 4
  6. const char MoneyMul[4] = {
  7. 'K', 'B', 'T', 'S'
  8. };
  9. void draw_player_scene(Canvas *const canvas, const GameState *game_state) {
  10. int max_card = game_state->player_card_count;
  11. if (max_card > 0)
  12. draw_deck((game_state->player_cards), max_card, canvas);
  13. if (game_state->dealer_card_count > 0)
  14. draw_card_back_at(13, 5, canvas);
  15. max_card = game_state->dealer_card_count;
  16. if (max_card > 1) {
  17. draw_card_at(2, 2, game_state->dealer_cards[1].pip, game_state->dealer_cards[1].character,
  18. canvas);
  19. }
  20. }
  21. void draw_dealer_scene(Canvas *const canvas, const GameState *game_state) {
  22. uint8_t max_card = game_state->dealer_card_count;
  23. draw_deck((game_state->dealer_cards), max_card, canvas);
  24. }
  25. void popup_frame(Canvas *const canvas) {
  26. canvas_set_color(canvas, ColorWhite);
  27. canvas_draw_box(canvas, 32, 15, 66, 13);
  28. canvas_set_color(canvas, ColorBlack);
  29. canvas_draw_frame(canvas, 32, 15, 66, 13);
  30. canvas_set_font(canvas, FontSecondary);
  31. }
  32. void draw_play_menu(Canvas *const canvas, const GameState *game_state) {
  33. const char *menus[3] = {"Double", "Hit", "Stay"};
  34. for (uint8_t m = 0; m < 3; m++) {
  35. if (m == 0 && (game_state->doubled || game_state->player_score < game_state->settings.round_price)) continue;
  36. int y = m * 13 + 25;
  37. canvas_set_color(canvas, ColorBlack);
  38. if (game_state->selectedMenu == m) {
  39. canvas_set_color(canvas, ColorBlack);
  40. canvas_draw_box(canvas, 1, y, 31, 12);
  41. } else {
  42. canvas_set_color(canvas, ColorWhite);
  43. canvas_draw_box(canvas, 1, y, 31, 12);
  44. canvas_set_color(canvas, ColorBlack);
  45. canvas_draw_frame(canvas, 1, y, 31, 12);
  46. }
  47. if (game_state->selectedMenu == m)
  48. canvas_set_color(canvas, ColorWhite);
  49. else
  50. canvas_set_color(canvas, ColorBlack);
  51. canvas_draw_str_aligned(canvas, 16, y + 6, AlignCenter, AlignCenter, menus[m]);
  52. }
  53. }
  54. void draw_screen(Canvas *const canvas, const bool *points) {
  55. for (uint8_t x = 0; x < 128; x++) {
  56. for (uint8_t y = 0; y < 64; y++) {
  57. if (points[y * 128 + x])
  58. canvas_draw_dot(canvas, x, y);
  59. }
  60. }
  61. }
  62. void draw_score(Canvas *const canvas, bool top, uint8_t amount) {
  63. char drawChar[20];
  64. snprintf(drawChar, sizeof(drawChar), "Player score: %i", amount);
  65. if (top)
  66. canvas_draw_str_aligned(canvas, 64, 2, AlignCenter, AlignTop, drawChar);
  67. else
  68. canvas_draw_str_aligned(canvas, 64, 62, AlignCenter, AlignBottom, drawChar);
  69. }
  70. void draw_money(Canvas *const canvas, uint32_t score) {
  71. canvas_set_font(canvas, FontSecondary);
  72. char drawChar[10];
  73. uint32_t currAmount = score;
  74. if (currAmount < 1000) {
  75. snprintf(drawChar, sizeof(drawChar), "$%lu", currAmount);
  76. } else {
  77. char c = 'K';
  78. for (uint8_t i = 0; i < 4; i++) {
  79. currAmount = currAmount / 1000;
  80. if (currAmount < 1000) {
  81. c = MoneyMul[i];
  82. break;
  83. }
  84. }
  85. snprintf(drawChar, sizeof(drawChar), "$%lu %c", currAmount, c);
  86. }
  87. canvas_draw_str_aligned(canvas, 126, 2, AlignRight, AlignTop, drawChar);
  88. }
  89. void draw_menu(Canvas *const canvas, const char *text, const char *value, int8_t y, bool left_caret, bool right_caret,
  90. bool selected) {
  91. UNUSED(selected);
  92. if (y < 0 || y >= 64) return;
  93. if (selected) {
  94. canvas_set_color(canvas, ColorBlack);
  95. canvas_draw_box(canvas, 0, y, 122, LINE_HEIGHT);
  96. canvas_set_color(canvas, ColorWhite);
  97. }
  98. canvas_draw_str_aligned(canvas, 4, y + ITEM_PADDING, AlignLeft, AlignTop, text);
  99. if (left_caret)
  100. canvas_draw_str_aligned(canvas, 80, y + ITEM_PADDING, AlignLeft, AlignTop, "<");
  101. canvas_draw_str_aligned(canvas, 100, y + ITEM_PADDING, AlignCenter, AlignTop, value);
  102. if (right_caret)
  103. canvas_draw_str_aligned(canvas, 120, y + ITEM_PADDING, AlignRight, AlignTop, ">");
  104. canvas_set_color(canvas, ColorBlack);
  105. }
  106. void settings_page(Canvas *const canvas, const GameState *gameState) {
  107. char drawChar[10];
  108. int startY = 0;
  109. if (LINE_HEIGHT * (gameState->selectedMenu + 1) >= 64) {
  110. startY -= (LINE_HEIGHT * (gameState->selectedMenu + 1)) - 64;
  111. }
  112. int scrollHeight = round(64 / 6.0) + ITEM_PADDING * 2;
  113. int scrollPos = 64 / (6.0 / (gameState->selectedMenu + 1)) - ITEM_PADDING * 2;
  114. canvas_set_color(canvas, ColorBlack);
  115. canvas_draw_box(canvas, 123, scrollPos, 4, scrollHeight);
  116. canvas_draw_box(canvas, 125, 0, 1, 64);
  117. snprintf(drawChar, sizeof(drawChar), "%li", gameState->settings.starting_money);
  118. draw_menu(canvas, "Start money", drawChar,
  119. 0 * LINE_HEIGHT + startY,
  120. gameState->settings.starting_money > gameState->settings.round_price,
  121. gameState->settings.starting_money < 400,
  122. gameState->selectedMenu == 0
  123. );
  124. snprintf(drawChar, sizeof(drawChar), "%li", gameState->settings.round_price);
  125. draw_menu(canvas, "Round price", drawChar,
  126. 1 * LINE_HEIGHT + startY,
  127. gameState->settings.round_price > 10,
  128. gameState->settings.round_price < gameState->settings.starting_money,
  129. gameState->selectedMenu == 1
  130. );
  131. snprintf(drawChar, sizeof(drawChar), "%li", gameState->settings.animation_duration);
  132. draw_menu(canvas, "Anim. length", drawChar,
  133. 2 * LINE_HEIGHT + startY,
  134. gameState->settings.animation_duration > 0,
  135. gameState->settings.animation_duration < 2000,
  136. gameState->selectedMenu == 2
  137. );
  138. snprintf(drawChar, sizeof(drawChar), "%li", gameState->settings.message_duration);
  139. draw_menu(canvas, "Popup time", drawChar,
  140. 3 * LINE_HEIGHT + startY,
  141. gameState->settings.message_duration > 0,
  142. gameState->settings.message_duration < 2000,
  143. gameState->selectedMenu == 3
  144. );
  145. // draw_menu(canvas, "Sound", gameState->settings.sound_effects ? "Yes" : "No",
  146. // 5 * LINE_HEIGHT + startY,
  147. // true,
  148. // true,
  149. // gameState->selectedMenu == 5
  150. // );
  151. }