Card.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "Card.h"
  2. #include "RenderBuffer.h"
  3. #include "Sprite.h"
  4. #include "../assets.h"
  5. static Sprite letters[] = {
  6. Sprite(sprite_2, BlackOnly),
  7. Sprite(sprite_3, BlackOnly),
  8. Sprite(sprite_4, BlackOnly),
  9. Sprite(sprite_5, BlackOnly),
  10. Sprite(sprite_6, BlackOnly),
  11. Sprite(sprite_7, BlackOnly),
  12. Sprite(sprite_8, BlackOnly),
  13. Sprite(sprite_9, BlackOnly),
  14. Sprite(sprite_10, BlackOnly),
  15. Sprite(sprite_J, BlackOnly),
  16. Sprite(sprite_Q, BlackOnly),
  17. Sprite(sprite_K, BlackOnly),
  18. Sprite(sprite_A, BlackOnly),
  19. };
  20. static Sprite suits[] = {
  21. Sprite(sprite_hearths, BlackOnly),
  22. Sprite(sprite_spades, BlackOnly),
  23. Sprite(sprite_diamonds, BlackOnly),
  24. Sprite(sprite_clubs, BlackOnly)
  25. };
  26. static Sprite backSide = Sprite(sprite_pattern_big, BlackOnly);
  27. void Card::Render(int8_t x, int8_t y, bool selected, RenderBuffer *buffer, uint8_t size_limit) {
  28. uint8_t height = y + fmin(size_limit, 22);
  29. if (exposed) {
  30. buffer->draw_rbox(x, y, x + 16, height, White);
  31. buffer->draw_rbox_frame(x, y, x + 16, height, Black);
  32. buffer->draw(&(letters[value]), (Vector) {(float) x + 6, (float) y + 5}, 0);
  33. buffer->draw(&(suits[suit]), (Vector) {(float) x + 12, (float) y + 5}, 0);
  34. if (size_limit > 8) {
  35. buffer->draw(&(letters[value]), (Vector) {(float) x + 10, (float) y + 16}, M_PI);
  36. buffer->draw(&(suits[suit]), (Vector) {(float) x + 4, (float) y + 16}, M_PI);
  37. }
  38. if (selected) {
  39. buffer->draw_box(x + 1, y + 1, x + 16, height, Flip);
  40. }
  41. } else {
  42. RenderBack(x, y, selected, buffer, size_limit);
  43. }
  44. }
  45. void Card::RenderEmptyCard(uint8_t x, uint8_t y, RenderBuffer *buffer) {
  46. buffer->draw_rbox(x, y, x + 17, y + 23, Black);
  47. buffer->draw_rbox_frame(x + 2, y + 2, x + 14, y + 20, White);
  48. }
  49. void Card::RenderBack(uint8_t x, uint8_t y, bool selected, RenderBuffer *buffer, uint8_t size_limit) {
  50. uint8_t height = y + fmin(size_limit, 22);
  51. buffer->draw_box(x + 1, y + 1, x + 16, height, White);
  52. buffer->draw_rbox_frame(x, y, x + 16, height, Black);
  53. buffer->draw(&backSide, (Vector) {(float) x + 9, (float) y + 11}, 15, fmin(size_limit, 22), 0);
  54. if (selected) {
  55. buffer->draw_box(x + 1, y + 1, x + 16, height, Flip);
  56. }
  57. }
  58. bool Card::CanPlaceFoundation(Card *where) {
  59. if (!where || (where->value==-1 && where->suit==suit)) {
  60. return value == ACE;
  61. }
  62. return where->suit == suit && ((where->value + 1) % 13 == value % 13);
  63. }
  64. bool Card::CanPlaceColumn(Card *where) {
  65. if (!where) {
  66. return value == KING;
  67. }
  68. return where->suit % 2 == (suit + 1) % 2 && (value + 1) == where->value ;
  69. }
  70. void Card::print() {
  71. FURI_LOG_D("Card", "%i %i", suit, value);
  72. }
  73. void Card::TryRender(Card *c, uint8_t x, uint8_t y, bool selected, RenderBuffer *buffer, uint8_t size_limit) {
  74. if (c) {
  75. c->Render(x, y, selected, buffer, size_limit);
  76. } else {
  77. RenderEmptyCard(x, y, buffer);
  78. if(selected)
  79. buffer->draw_rbox(x+1, y+1, x + 16, y + 22, Flip);
  80. }
  81. }