ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Game/Game.cpp

Committer:
el17ajf
Date:
2019-04-03
Revision:
21:62d2b5b73160
Parent:
19:370d83a8dc33
Child:
22:0a474f074553

File content as of revision 21:62d2b5b73160:

#include "Game.h"
#include "Input.h"
#include "Engine.h"
#include "MenuManager.h"
#include "GameOverMenu.h"
#include "Prefs.h"

Game::Game(Difficulty difficulty) {
    currentTetromino = Tetromino::getTetrominoOfType(
        Tetromino::getRandomTetrominoType());
    nextTetrominoType = Tetromino::getRandomTetrominoType();
    
    switch (difficulty) {
        case EASY:
            move_frames = Engine::FPS / 6; // ~ 160ms
            scoreForRow = 6;
            break;
        case MEDIUM:
            move_frames = Engine::FPS / 9; // ~ 110ms
            scoreForRow = 8;
            break;
        case HARD:
            move_frames = Engine::FPS / 12; // ~ 80ms
            scoreForRow = 10;
            break;
    }
    frames = 0;
    last_move_frame = 0;
    start_x = Grid::GRID_WIDTH / 2 - 1;
    currentTetromino = currentTetromino.teleportedTo(start_x);
    score = 0;
    playerNumber = Prefs::getInstance()->getKey(Prefs::LAST_PLAYER) + 1;
}

Game::~Game() {
    
}

void Game::update() {
    if (frames++ > last_move_frame + move_frames) {
        last_move_frame = frames;
        moveCurrentTetrominoDown();
    }
    
    if (Input::buttonHit(Input::LEFT)) {
        if (grid.isSpaceForTetromino(currentTetromino.movedLeft())) {
            currentTetromino = currentTetromino.movedLeft();
        }
    }
    if (Input::buttonHit(Input::RIGHT)) {
        if (grid.isSpaceForTetromino(currentTetromino.movedRight())) {
            currentTetromino = currentTetromino.movedRight();
        }
    }
    if (Input::buttonHit(Input::UP)) {
        if (grid.isSpaceForTetromino(currentTetromino.rotatedClockwise())) {
            currentTetromino = currentTetromino.rotatedClockwise();
        }
    }
    if (Input::buttonHit(Input::DOWN)) {
        dropCurrentTetromino();
    }
}

void Game::addScore(int rowsCleared) {
    score += scoreForRow * rowsCleared * rowsCleared;
    if (score > 9999) {
        score = 9999;
    }
}

void Game::moveCurrentTetrominoDown() {
    if (grid.isSpaceForTetromino(currentTetromino.movedDown())) {
        currentTetromino = currentTetromino.movedDown();
    } else {
        int rowsCleared = grid.placeTetromino(currentTetromino);
        if (rowsCleared != 0) {
            addScore(rowsCleared);
        }
        currentTetromino = Tetromino::getTetrominoOfType(nextTetrominoType);
        // centre it
        currentTetromino = currentTetromino.teleportedTo(start_x);
        if (!grid.isSpaceForTetromino(currentTetromino)) {
            // no space for tetromino, game over
            gameOver();
        }
        nextTetrominoType = Tetromino::getRandomTetrominoType();
    }
}

void Game::dropCurrentTetromino() {
    while (grid.isSpaceForTetromino(currentTetromino.movedDown())) {
        score += 1;
        currentTetromino = currentTetromino.movedDown();
    }
    moveCurrentTetrominoDown();
}

void Game::draw() {
    currentTetromino.draw();
    grid.draw();
}

void Game::addScoreToLeaderboard() {
    for (int i = 0; i < Prefs::HIGHSCORE3; i++) {
        if (score > Prefs::getInstance()->getKey((Prefs::Key)i)) {
            Prefs::getInstance()->setKey((Prefs::Key)i, score);
            Prefs::getInstance()->setKey((Prefs::Key)(i + 3), playerNumber);
        }
    }
}

void Game::gameOver() {
    addScoreToLeaderboard();
    Prefs::getInstance()->setKey(Prefs::LAST_PLAYER, playerNumber);
    Menus::MenuManager::add(new Menus::GameOverMenu());
}