fixed game logic
This commit is contained in:
@@ -64,6 +64,7 @@ void Game::nextFrame(const std::set<Action>& playerActions) {
|
||||
if (this->leftARETime == 0) {
|
||||
if (AREJustEnded) {
|
||||
this->lost = this->board.spawnNextPiece();
|
||||
this->resetPiece(true);
|
||||
}
|
||||
|
||||
/* IRS and IHS */
|
||||
@@ -73,33 +74,17 @@ void Game::nextFrame(const std::set<Action>& playerActions) {
|
||||
+ ((this->initialActions.contains(ROTATE_CCW)) ? COUNTERCLOCKWISE : NONE);
|
||||
|
||||
if (this->initialActions.contains(HOLD)) {
|
||||
if (this->board.hold(initialRotation)) {
|
||||
this->subVerticalPosition = 0;
|
||||
this->totalLockDelay = 0;
|
||||
this->heldARR = 0;
|
||||
}
|
||||
else {
|
||||
this->lost = true;
|
||||
}
|
||||
this->lost = (!this->board.hold(initialRotation));
|
||||
}
|
||||
else {
|
||||
if (initialRotation != NONE || this->initialActions.contains(ROTATE_0)) {
|
||||
Position before = this->board.getActivePiecePosition();
|
||||
if (this->board.rotate(initialRotation)) {
|
||||
this->totalLockDelay = 0;
|
||||
if (before != this->board.getActivePiecePosition()) {
|
||||
this->subVerticalPosition = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
this->lost = true;
|
||||
}
|
||||
if ((initialRotation != NONE) || this->initialActions.contains(ROTATE_0)) {
|
||||
this->lost = (!this->board.rotate(initialRotation));
|
||||
}
|
||||
}
|
||||
|
||||
if (this->lost) {
|
||||
if (initialRotation == NONE && (!this->initialActions.contains(ROTATE_0))) {
|
||||
this->board.rotate(NONE);
|
||||
if (initialRotation == NONE) {
|
||||
this->lost = (!this->board.rotate(initialRotation));
|
||||
}
|
||||
}
|
||||
if (this->lost) {
|
||||
@@ -110,23 +95,22 @@ void Game::nextFrame(const std::set<Action>& playerActions) {
|
||||
/* HOLD */
|
||||
if (playerActions.contains(HOLD) && (!this->heldActions.contains(HOLD))) {
|
||||
if (this->board.hold()) {
|
||||
this->subVerticalPosition = 0;
|
||||
this->totalLockDelay = 0;
|
||||
this->heldARR = 0;
|
||||
this->resetPiece(false);
|
||||
}
|
||||
}
|
||||
|
||||
/* MOVE LEFT/RIGHT */
|
||||
Position before = this->board.getActivePiecePosition();
|
||||
|
||||
if (playerActions.contains(MOVE_LEFT)) {
|
||||
this->movePiece(-1);
|
||||
if (this->heldDAS >= 0) {
|
||||
if (playerActions.contains(MOVE_LEFT) && (!heldActions.contains(MOVE_LEFT))) this->movePiece(-1);
|
||||
else if (playerActions.contains(MOVE_RIGHT)) this->movePiece(1);
|
||||
else this->heldDAS = 0;
|
||||
}
|
||||
else if (playerActions.contains(MOVE_RIGHT)) {
|
||||
this->movePiece(1);
|
||||
}
|
||||
else {
|
||||
this->heldDAS = 0;
|
||||
else if (this->heldDAS < 0) {
|
||||
if (playerActions.contains(MOVE_RIGHT) && (!heldActions.contains(MOVE_RIGHT))) this->movePiece(1);
|
||||
else if (playerActions.contains(MOVE_LEFT)) this->movePiece(-1);
|
||||
else this->heldDAS = 0;
|
||||
}
|
||||
|
||||
if (before != this->board.getActivePiecePosition()) {
|
||||
@@ -134,31 +118,17 @@ void Game::nextFrame(const std::set<Action>& playerActions) {
|
||||
}
|
||||
|
||||
/* ROTATIONS */
|
||||
before = this->board.getActivePiecePosition();
|
||||
|
||||
if (playerActions.contains(ROTATE_0) && (!this->heldActions.contains(ROTATE_0))) {
|
||||
if (this->board.rotate(NONE)) {
|
||||
this->totalLockDelay = 0;
|
||||
}
|
||||
this->rotatePiece(NONE);
|
||||
}
|
||||
if (playerActions.contains(ROTATE_CW) && (!this->heldActions.contains(ROTATE_CW))) {
|
||||
if (this->board.rotate(CLOCKWISE)) {
|
||||
this->totalLockDelay = 0;
|
||||
}
|
||||
this->rotatePiece(CLOCKWISE);
|
||||
}
|
||||
if (playerActions.contains(ROTATE_180) && (!this->heldActions.contains(ROTATE_180))) {
|
||||
if (this->board.rotate(DOUBLE)) {
|
||||
this->totalLockDelay = 0;
|
||||
}
|
||||
this->rotatePiece(DOUBLE);
|
||||
}
|
||||
if (playerActions.contains(ROTATE_CCW) && (!this->heldActions.contains(ROTATE_CCW))) {
|
||||
if (this->board.rotate(COUNTERCLOCKWISE)) {
|
||||
this->totalLockDelay = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (before != this->board.getActivePiecePosition()) {
|
||||
this->subVerticalPosition = 0;
|
||||
this->rotatePiece(COUNTERCLOCKWISE);
|
||||
}
|
||||
|
||||
/* SOFT DROP */
|
||||
@@ -238,45 +208,61 @@ void Game::nextFrame(const std::set<Action>& playerActions) {
|
||||
this->initialActions.insert(action);
|
||||
}
|
||||
|
||||
if (playerActions.contains(MOVE_LEFT)) {
|
||||
this->heldDAS = std::min(-1, this->heldDAS - 1);
|
||||
if (this->heldDAS >= 0) {
|
||||
if (playerActions.contains(MOVE_LEFT)) this->heldDAS = -1;
|
||||
else if (playerActions.contains(MOVE_RIGHT)) this->heldDAS++;
|
||||
else this->heldDAS = 0;
|
||||
}
|
||||
else if (playerActions.contains(MOVE_RIGHT)) {
|
||||
this->heldDAS = std::max(1, this->heldDAS + 1);
|
||||
}
|
||||
else {
|
||||
this->heldDAS = 0;
|
||||
else if (this->heldDAS < 0) {
|
||||
if (playerActions.contains(MOVE_RIGHT)) this->heldDAS = +1;
|
||||
else if (playerActions.contains(MOVE_LEFT)) this->heldDAS--;
|
||||
else this->heldDAS = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Game::resetPiece(bool newPiece) {
|
||||
int appliedDAS = this->parameters.getDAS();
|
||||
|
||||
this->subVerticalPosition = 0;
|
||||
this->totalLockDelay = 0;
|
||||
if (newPiece) {
|
||||
this->totalForcedLockDelay = 0;
|
||||
}
|
||||
if (abs(this->heldDAS) > appliedDAS) {
|
||||
this->heldDAS = (this->heldDAS > 0) ? (+appliedDAS) : (-appliedDAS);
|
||||
}
|
||||
this->heldARR = 0;
|
||||
}
|
||||
|
||||
void Game::movePiece(int movement) {
|
||||
std::cout << movement << std::endl;
|
||||
int appliedDAS = this->parameters.getDAS();
|
||||
int appliedARR = this->parameters.getARR();
|
||||
|
||||
if ((this->heldDAS * movement) <= 0) {
|
||||
this->heldDAS = movement;
|
||||
this->heldARR = 0;
|
||||
if (movement == -1) this->board.moveLeft();
|
||||
if (movement == 1) this->board.moveRight();
|
||||
}
|
||||
else {
|
||||
this->heldDAS += movement;
|
||||
}
|
||||
|
||||
if (abs(this->heldDAS) == appliedDAS + 1) {
|
||||
if (movement == -1) this->board.moveLeft();
|
||||
if (movement == 1) this->board.moveRight();
|
||||
}
|
||||
|
||||
if (abs(this->heldDAS) > appliedDAS + 1) {
|
||||
if (abs(this->heldDAS) > appliedDAS) {
|
||||
// ARR=0 -> instant movement
|
||||
if (appliedARR == 0) {
|
||||
if (movement == -1) while (this->board.moveLeft());
|
||||
if (movement == 1) while (this->board.moveRight());
|
||||
}
|
||||
|
||||
// ARR>1 -> move by specified amount
|
||||
else {
|
||||
this->heldARR++;
|
||||
if (this->heldARR == appliedARR) {
|
||||
if (abs(this->heldDAS) > appliedDAS + 1) {
|
||||
this->heldARR++;
|
||||
}
|
||||
if ((this->heldARR == appliedARR) || (abs(this->heldDAS) == (appliedDAS + 1))) {
|
||||
this->heldARR = 0;
|
||||
if (movement == -1) this->board.moveLeft();
|
||||
if (movement == 1) this->board.moveRight();
|
||||
@@ -285,6 +271,17 @@ void Game::movePiece(int movement) {
|
||||
}
|
||||
}
|
||||
|
||||
void Game::rotatePiece(Rotation rotation) {
|
||||
Position before = this->board.getActivePiecePosition();
|
||||
|
||||
if (this->board.rotate(rotation)) {
|
||||
this->totalLockDelay = 0;
|
||||
if (before != this->board.getActivePiecePosition()) {
|
||||
this->subVerticalPosition = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Game::lockPiece() {
|
||||
LineClear clear = this->board.lockPiece();
|
||||
this->parameters.clearLines(clear.lines);
|
||||
@@ -300,16 +297,12 @@ void Game::lockPiece() {
|
||||
this->score += clearScore;
|
||||
}
|
||||
this->B2BChain = B2BConditionsAreMet;
|
||||
|
||||
this->subVerticalPosition = 0;
|
||||
this->totalLockDelay = 0;
|
||||
this->totalForcedLockDelay = 0;
|
||||
this->heldARR = 0;
|
||||
|
||||
if (!this->hasWon()) {
|
||||
this->leftARETime = this->parameters.getARE();
|
||||
if (this->leftARETime == 0) {
|
||||
this->lost = this->board.spawnNextPiece();
|
||||
this->resetPiece(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user