Game.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "Game.h"
  2. #include "assets.h"
  3. static Sprite logo = Sprite(sprite_logo, BlackOnly);
  4. static Sprite main_image = Sprite(sprite_main_image, BlackOnly);
  5. static Sprite start = Sprite(sprite_start, BlackOnly);
  6. Game::~Game() {
  7. delete deck;
  8. for (int i = 0; i < 4; i++)
  9. delete piles[i];
  10. delete buffer;
  11. }
  12. void Game::Render(Canvas *const canvas) {
  13. if (!buffer) return;
  14. if (had_change) {
  15. if (state == GameStateStart) {
  16. buffer->clear();
  17. buffer->draw(&logo, (Vector) {60, 30}, 0);
  18. buffer->draw(&main_image, (Vector) {110, 25}, 0);
  19. buffer->draw(&start, (Vector) {64, 55}, 0);
  20. } else if (state == GameStatePlay) {
  21. buffer->clear();
  22. if (deck)
  23. deck->Render(buffer, current_row == 0 && current_column == 0, current_row == 0 && current_column == 1);
  24. for (int i = 0; i < 7; i++) {
  25. bool selected = current_row == 1 && current_column == i;
  26. tableau[i].Render(i * 18 + 1, 25, selected, selected ? column_selection : 0, buffer);
  27. }
  28. for (int i = 0; i < 4; i++) {
  29. bool pileSelected = current_row == 0 && (current_column - 3) == i;
  30. if (piles[i]) {
  31. piles[i]->Render(i * 18 + 55, 1, pileSelected, buffer, 22);
  32. } else {
  33. Card::RenderEmptyCard(i * 18 + 55, 1, buffer);
  34. if (pileSelected) {
  35. buffer->draw_rbox(i * 18 + 56, 2, i * 18 + 71, 23, Flip);
  36. }
  37. }
  38. }
  39. }
  40. }
  41. had_change = false;
  42. buffer->render(canvas);
  43. }
  44. Game::Game() {
  45. deck = new Deck(1);
  46. buffer = new RenderBuffer(128, 64);
  47. }
  48. void Game::NewRound() {
  49. round_start = furi_get_tick();
  50. state = GameStatePlay;
  51. had_change = true;
  52. }
  53. void Game::Reset() {
  54. can_auto_solve = false;
  55. current_column = 0;
  56. current_row = 0;
  57. column_selection = -1;
  58. deck->Generate();
  59. //Reset foundations
  60. for (int i = 0; i < 4; i++) {
  61. if (piles[i]) delete piles[i];
  62. piles[i] = nullptr;
  63. }
  64. //Populate columns
  65. for (int i = 0; i < 7; i++) {
  66. tableau[i].Reset();
  67. for (int j = 0; j <= i; j++) {
  68. Card *card = deck->Extract();
  69. if (j >= i) card->exposed = true;
  70. tableau[i].AddCard(card);
  71. }
  72. }
  73. }
  74. void Game::LongPress(InputKey key) {
  75. UNUSED(key);
  76. }
  77. void Game::Update(NotificationApp *app) {
  78. UNUSED(app);
  79. }
  80. void Game::Press(InputKey key) {
  81. if (key == InputKeyOk && state == GameStateStart) {
  82. Reset();
  83. NewRound();
  84. had_change = true;
  85. return;
  86. }
  87. if (key == InputKeyBack && state == GameStatePlay) {
  88. state = GameStateStart;
  89. had_change = true;
  90. return;
  91. }
  92. if(key == InputKeyOk && current_column == 0 && current_row == 0){
  93. deck->Cycle();
  94. had_change = true;
  95. }
  96. if (key == InputKeyLeft && current_column > 0) {
  97. current_column--;
  98. had_change = true;
  99. } else if (key == InputKeyRight && current_column < 6) {
  100. current_column++;
  101. if (current_row == 0 && current_column == 2) current_column++;
  102. had_change = true;
  103. }
  104. if (key == InputKeyUp && current_row == 1) {
  105. uint8_t count = tableau[current_column].Count() - 1;
  106. uint8_t first_non_flipped = tableau[current_column].FirstNonFlipped();
  107. if (count > first_non_flipped && (column_selection + 1) > count) {
  108. column_selection++;
  109. } else
  110. current_row--;
  111. had_change = true;
  112. } else if (key == InputKeyDown && current_row == 0) {
  113. current_row++;
  114. column_selection = 0;
  115. had_change = true;
  116. }
  117. //disable empty space selection
  118. if (current_row == 0 && current_column == 2) {
  119. current_column--;
  120. had_change = true;
  121. }
  122. }