| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #include "Card.h"
- #include "RenderBuffer.h"
- #include "Sprite.h"
- #include "../assets.h"
- static Sprite letters[] = {
- Sprite(sprite_2, BlackOnly),
- Sprite(sprite_3, BlackOnly),
- Sprite(sprite_4, BlackOnly),
- Sprite(sprite_5, BlackOnly),
- Sprite(sprite_6, BlackOnly),
- Sprite(sprite_7, BlackOnly),
- Sprite(sprite_8, BlackOnly),
- Sprite(sprite_9, BlackOnly),
- Sprite(sprite_10, BlackOnly),
- Sprite(sprite_J, BlackOnly),
- Sprite(sprite_Q, BlackOnly),
- Sprite(sprite_K, BlackOnly),
- Sprite(sprite_A, BlackOnly),
- };
- static Sprite suits[] = {
- Sprite(sprite_hearths, BlackOnly),
- Sprite(sprite_spades, BlackOnly),
- Sprite(sprite_diamonds, BlackOnly),
- Sprite(sprite_clubs, BlackOnly)
- };
- static Sprite backSide = Sprite(sprite_pattern_big, BlackOnly);
- void Card::Render(int8_t x, int8_t y, bool selected, RenderBuffer *buffer, uint8_t size_limit) {
- uint8_t height = y + fmin(size_limit, 22);
- if (exposed) {
- buffer->draw_rbox(x, y, x + 16, height, White);
- buffer->draw_rbox_frame(x, y, x + 16, height, Black);
- buffer->draw(&(letters[value]), (Vector) {(float) x + 6, (float) y + 5}, 0);
- buffer->draw(&(suits[suit]), (Vector) {(float) x + 12, (float) y + 5}, 0);
- if (size_limit > 8) {
- buffer->draw(&(letters[value]), (Vector) {(float) x + 10, (float) y + 16}, M_PI);
- buffer->draw(&(suits[suit]), (Vector) {(float) x + 4, (float) y + 16}, M_PI);
- }
- if (selected) {
- buffer->draw_box(x + 1, y + 1, x + 16, height, Flip);
- }
- } else {
- RenderBack(x, y, selected, buffer, size_limit);
- }
- }
- void Card::RenderEmptyCard(uint8_t x, uint8_t y, RenderBuffer *buffer) {
- buffer->draw_rbox(x, y, x + 17, y + 23, Black);
- buffer->draw_rbox_frame(x + 2, y + 2, x + 14, y + 20, White);
- }
- void Card::RenderBack(uint8_t x, uint8_t y, bool selected, RenderBuffer *buffer, uint8_t size_limit) {
- uint8_t height = y + fmin(size_limit, 22);
- buffer->draw_box(x + 1, y + 1, x + 16, height, White);
- buffer->draw_rbox_frame(x, y, x + 16, height, Black);
- buffer->draw(&backSide, (Vector) {(float) x + 9, (float) y + 11}, 15, fmin(size_limit, 22), 0);
- if (selected) {
- buffer->draw_box(x + 1, y + 1, x + 16, height, Flip);
- }
- }
- bool Card::CanPlaceFoundation(Card *where) {
- if (!where || (where->value==-1 && where->suit==suit)) {
- return value == ACE;
- }
- return where->suit == suit && ((where->value + 1) % 13 == value % 13);
- }
- bool Card::CanPlaceColumn(Card *where) {
- if (!where) {
- return value == KING;
- }
- return where->suit % 2 == (suit + 1) % 2 && (value + 1) == where->value ;
- }
- void Card::print() {
- FURI_LOG_D("Card", "%i %i", suit, value);
- }
- void Card::TryRender(Card *c, uint8_t x, uint8_t y, bool selected, RenderBuffer *buffer, uint8_t size_limit) {
- if (c) {
- c->Render(x, y, selected, buffer, size_limit);
- } else {
- RenderEmptyCard(x, y, buffer);
- if(selected)
- buffer->draw_rbox(x+1, y+1, x + 16, y + 22, Flip);
- }
- }
|