Card.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "Card.h"
  2. #include "RenderBuffer.h"
  3. #include "../assets.h"
  4. static Sprite letters[] = {
  5. Sprite(sprite_2, BlackOnly),
  6. Sprite(sprite_3, BlackOnly),
  7. Sprite(sprite_4, BlackOnly),
  8. Sprite(sprite_5, BlackOnly),
  9. Sprite(sprite_6, BlackOnly),
  10. Sprite(sprite_7, BlackOnly),
  11. Sprite(sprite_8, BlackOnly),
  12. Sprite(sprite_9, BlackOnly),
  13. Sprite(sprite_10, BlackOnly),
  14. Sprite(sprite_J, BlackOnly),
  15. Sprite(sprite_Q, BlackOnly),
  16. Sprite(sprite_K, BlackOnly),
  17. Sprite(sprite_A, BlackOnly),
  18. };
  19. static Sprite suits[] = {
  20. Sprite(sprite_hearths, BlackOnly),
  21. Sprite(sprite_diamonds, BlackOnly),
  22. Sprite(sprite_spades, BlackOnly),
  23. Sprite(sprite_clubs, BlackOnly)
  24. };
  25. static Sprite backSide = Sprite(sprite_pattern_big, BlackOnly);
  26. void Card::Render(uint8_t x, uint8_t y, bool selected, RenderBuffer *buffer, uint8_t size_limit) {
  27. uint8_t height = y + fmin(size_limit, 22);
  28. if (exposed) {
  29. buffer->draw_rbox(x, y, x + 16, height, White);
  30. buffer->draw_rbox_frame(x, y, x + 16, height, Black);
  31. buffer->draw(&(letters[value]), (Vector) {(float) x + 5, (float) y + 6}, 0);
  32. buffer->draw(&(suits[suit]), (Vector) {(float) x + 12, (float) y + 6}, 0);
  33. if (size_limit > 8) {
  34. buffer->draw(&(letters[value]), (Vector) {(float) x + 12, (float) y + 17}, M_PI);
  35. buffer->draw(&(suits[suit]), (Vector) {(float) x + 5, (float) y + 17}, M_PI);
  36. }
  37. if (selected) {
  38. buffer->draw_box(x + 1, y + 1, x + 16, height, Flip);
  39. }
  40. } else {
  41. RenderBack(x, y, selected, buffer, size_limit);
  42. }
  43. }
  44. void Card::RenderEmptyCard(uint8_t x, uint8_t y, RenderBuffer *buffer) {
  45. buffer->draw_rbox(x, y, x + 17, y + 23, Black);
  46. buffer->draw_rbox_frame(x + 2, y + 2, x + 14, y + 20, White);
  47. }
  48. void Card::RenderBack(uint8_t x, uint8_t y, bool selected, RenderBuffer *buffer, uint8_t size_limit) {
  49. uint8_t height = y + fmin(size_limit, 22);
  50. buffer->draw_box(x + 1, y + 1, x + 16, height, White);
  51. buffer->draw_rbox_frame(x, y, x + 16, height, Black);
  52. buffer->draw(&backSide, (Vector) {(float) x + 9, (float) y + 12}, 15, fmin(size_limit, 22), 0);
  53. if (selected) {
  54. buffer->draw_box(x + 1, y + 1, x + 16, height, Flip);
  55. }
  56. }
  57. bool Card::CanPlace(Card *a, Card *b) {
  58. if (a == nullptr) {
  59. return b->value == 12;
  60. }
  61. return a->suit == b->suit && ((b->value + 1) % 13 == (a->value + 2) % 13);
  62. }