diff --git a/src/tetris/background.h b/src/tetris/background.h index 376370d90..a3c78b43c 100644 --- a/src/tetris/background.h +++ b/src/tetris/background.h @@ -31,6 +31,19 @@ void DrawBoard() { } channels_set_fg_alpha(&channels, CELL_ALPHA_TRANSPARENT); board_->set_base(channels, 0, ""); + scoreplane_ = std::make_unique(1, 20, y - BOARD_HEIGHT, 2, nullptr); + if(!scoreplane_){ + throw TetrisNotcursesErr("Plane()"); + } + uint64_t scorechan = 0; + channels_set_bg_alpha(&scorechan, CELL_ALPHA_TRANSPARENT); + channels_set_fg_alpha(&scorechan, CELL_ALPHA_TRANSPARENT); + if(!scoreplane_->set_base(scorechan, 0, "")){ + throw TetrisNotcursesErr("set_base()"); + } + scoreplane_->set_fg(0x00d0a0); + scoreplane_->set_bg_alpha(CELL_ALPHA_TRANSPARENT); + UpdateScore(); if(!nc_.render()){ throw TetrisNotcursesErr("render()"); } diff --git a/src/tetris/lock.h b/src/tetris/lock.h index 2c61a3ed0..fd72e6319 100644 --- a/src/tetris/lock.h +++ b/src/tetris/lock.h @@ -45,8 +45,18 @@ void LockPiece(){ } } } - /*for(int x = 1 ; x < bdimx - 1 ; ++x){ - }*/ + linescleared_ += cleared; + if(cleared == 4){ + score_ += (level_ + 1) * 1000; + }else if(cleared == 3){ + score_ += (level_ + 1) * 350; + }else if(cleared == 2){ + score_ += (level_ + 1) * 150; + }else{ + score_ += (level_ + 1) * 50; + } + level_ = linescleared_ / 10; + UpdateScore(); } }while(cleared); } diff --git a/src/tetris/main.cpp b/src/tetris/main.cpp index 608b1a552..bb9ffaa9c 100644 --- a/src/tetris/main.cpp +++ b/src/tetris/main.cpp @@ -32,8 +32,10 @@ public: board_(nullptr), backg_(nullptr), stdplane_(nc_.get_stdplane()), + scoreplane_(nullptr), gameover_(gameover), level_(0), + linescleared_(0), msdelay_(Gravity(level_)) { DrawBoard(); @@ -46,6 +48,7 @@ public: #include "gravity.h" #include "ticker.h" +#include "score.h" #include "clear.h" #include "lock.h" #include "movedown.h" @@ -61,9 +64,11 @@ private: std::unique_ptr board_; std::unique_ptr backg_; ncpp::Plane* stdplane_; + std::unique_ptr scoreplane_; std::atomic_bool& gameover_; int board_top_y_; int level_; + int linescleared_; std::chrono::milliseconds msdelay_; // Returns true if there's a current piece which can be moved diff --git a/src/tetris/score.h b/src/tetris/score.h new file mode 100644 index 000000000..3d7487b56 --- /dev/null +++ b/src/tetris/score.h @@ -0,0 +1,5 @@ +void UpdateScore(){ + if(scoreplane_->printf(0, 0, "level: %02d score: %ju", level_, static_cast(score_)) < 0){ + throw TetrisNotcursesErr("printf()"); + } +}