| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #include "Game.h"
- #include "assets.h"
- static Sprite logo = Sprite(sprite_logo, BlackOnly);
- static Sprite main_image = Sprite(sprite_main_image, BlackOnly);
- static Sprite start = Sprite(sprite_start, BlackOnly);
- Game::~Game() {
- delete deck;
- for (int i = 0; i < 4; i++)
- delete piles[i];
- delete buffer;
- }
- void Game::Render(Canvas *const canvas) {
- if (!buffer) return;
- if (had_change) {
- if (state == GameStateStart) {
- buffer->clear();
- buffer->draw(&logo, (Vector) {60, 30}, 0);
- buffer->draw(&main_image, (Vector) {110, 25}, 0);
- buffer->draw(&start, (Vector) {64, 55}, 0);
- } else if (state == GameStatePlay) {
- buffer->clear();
- if (deck)
- deck->Render(buffer, current_row == 0 && current_column == 0, current_row == 0 && current_column == 1);
- for (int i = 0; i < 7; i++) {
- bool selected = current_row == 1 && current_column == i;
- tableau[i].Render(i * 18 + 1, 25, selected, selected ? column_selection : 0, buffer);
- }
- for (int i = 0; i < 4; i++) {
- bool pileSelected = current_row == 0 && (current_column - 3) == i;
- if (piles[i]) {
- piles[i]->Render(i * 18 + 55, 1, pileSelected, buffer, 22);
- } else {
- Card::RenderEmptyCard(i * 18 + 55, 1, buffer);
- if (pileSelected) {
- buffer->draw_rbox(i * 18 + 56, 2, i * 18 + 71, 23, Flip);
- }
- }
- }
- }
- }
- had_change = false;
- buffer->render(canvas);
- }
- Game::Game() {
- deck = new Deck(1);
- buffer = new RenderBuffer(128, 64);
- }
- void Game::NewRound() {
- round_start = furi_get_tick();
- state = GameStatePlay;
- had_change = true;
- }
- void Game::Reset() {
- can_auto_solve = false;
- current_column = 0;
- current_row = 0;
- column_selection = -1;
- deck->Generate();
- //Reset foundations
- for (int i = 0; i < 4; i++) {
- if (piles[i]) delete piles[i];
- piles[i] = nullptr;
- }
- //Populate columns
- for (int i = 0; i < 7; i++) {
- tableau[i].Reset();
- for (int j = 0; j <= i; j++) {
- Card *card = deck->Extract();
- if (j >= i) card->exposed = true;
- tableau[i].AddCard(card);
- }
- }
- }
- void Game::LongPress(InputKey key) {
- UNUSED(key);
- }
- void Game::Update(NotificationApp *app) {
- UNUSED(app);
- }
- void Game::Press(InputKey key) {
- if (key == InputKeyOk && state == GameStateStart) {
- Reset();
- NewRound();
- had_change = true;
- return;
- }
- if (key == InputKeyBack && state == GameStatePlay) {
- state = GameStateStart;
- had_change = true;
- return;
- }
- if(key == InputKeyOk && current_column == 0 && current_row == 0){
- deck->Cycle();
- had_change = true;
- }
- if (key == InputKeyLeft && current_column > 0) {
- current_column--;
- had_change = true;
- } else if (key == InputKeyRight && current_column < 6) {
- current_column++;
- if (current_row == 0 && current_column == 2) current_column++;
- had_change = true;
- }
- if (key == InputKeyUp && current_row == 1) {
- uint8_t count = tableau[current_column].Count() - 1;
- uint8_t first_non_flipped = tableau[current_column].FirstNonFlipped();
- if (count > first_non_flipped && (column_selection + 1) > count) {
- column_selection++;
- } else
- current_row--;
- had_change = true;
- } else if (key == InputKeyDown && current_row == 0) {
- current_row++;
- column_selection = 0;
- had_change = true;
- }
- //disable empty space selection
- if (current_row == 0 && current_column == 2) {
- current_column--;
- had_change = true;
- }
- }
|