stats in-game

This commit is contained in:
2025-03-28 21:00:46 +01:00
parent be071bd606
commit 0f026635f6
11 changed files with 164 additions and 39 deletions

View File

@@ -9,8 +9,8 @@
#include <memory>
static const int SUBPX_PER_ROW = 60; // the number of position the active piece can take "between" two rows
static const int SOFT_DROP_SCORE = 1; // the score gained by line soft dropped
static const int HARD_DROP_SCORE = 2; // the score gained by line hard dropped
static const int LOCK_DELAY_SCORE = 1; // the score gained when the piece locks due to lock delay
static const int HARD_DROP_SCORE = 10; // the score gained when the piece locks due to an hard drop
static const int LINE_CLEAR_BASE_SCORE = 100; // the score value of clearing a single line
static const int B2B_SCORE_MULTIPLIER = 2; // by how much havaing B2B on multiplies the score of the line clear
static const int B2B_MIN_LINE_NUMBER = 4; // the minimum number of lines needed to be cleared at once to gain B2B (without a spin)
@@ -140,16 +140,14 @@ void Game::nextFrame(const std::set<Action>& playerActions) {
// SDR=0 -> instant drop
if (appliedSDR == 0) {
while (this->board.moveDown()) {
this->score += SOFT_DROP_SCORE;
}
while (this->board.moveDown());
}
// SDR>1 -> move down by specified amount
else {
this->subVerticalPosition += (SUBPX_PER_ROW / appliedSDR);
while (this->subVerticalPosition >= SUBPX_PER_ROW) {
this->board.moveDown();
this->subVerticalPosition -= SUBPX_PER_ROW;
this->score += (this->board.moveDown() * SOFT_DROP_SCORE);
}
}
}
@@ -157,11 +155,10 @@ void Game::nextFrame(const std::set<Action>& playerActions) {
/* HARD DROP */
// needs to be done last because we can enter ARE period afterwards
if (this->initialActions.contains(HARD_DROP) || (playerActions.contains(HARD_DROP) && (!this->heldActions.contains(HARD_DROP)))) {
while (this->board.moveDown()) {
this->score += HARD_DROP_SCORE;
}
while (this->board.moveDown());
this->lockPiece();
pieceJustLocked = true;
this->score += HARD_DROP_SCORE;
}
// no need to apply gravity and lock delay if the piece was hard dropped
else {
@@ -192,6 +189,7 @@ void Game::nextFrame(const std::set<Action>& playerActions) {
if ((this->totalLockDelay > this->parameters.getLockDelay()) || (this->totalForcedLockDelay > this->parameters.getForcedLockDelay())) {
this->lockPiece();
pieceJustLocked = true;
this->score += LOCK_DELAY_SCORE;
}
}
@@ -290,7 +288,7 @@ void Game::rotatePiece(Rotation rotation) {
void Game::lockPiece() {
LineClear clear = this->board.lockPiece();
this->parameters.clearLines(clear.lines);
this->parameters.lockedPiece(clear);
bool B2BConditionsAreMet = ((clear.lines > B2B_MIN_LINE_NUMBER) || clear.isSpin || clear.isMiniSpin);
if (clear.lines > 0) {
@@ -330,6 +328,10 @@ int Game::getClearedLines() const {
return this->parameters.getClearedLines();
}
int Game::getGrade() const {
return this->parameters.getGrade();
}
int Game::getLevel() const {
return this->parameters.getLevel();
}