solved pr comments; switched from hard lock task to reset counter
This commit is contained in:
@@ -82,11 +82,11 @@ class Tetris extends StatelessGame {
|
|||||||
|
|
||||||
private void onPlayerInteract(@NotNull PlayerUseItemEvent event) {
|
private void onPlayerInteract(@NotNull PlayerUseItemEvent event) {
|
||||||
event.setItemUseTime(0);
|
event.setItemUseTime(0);
|
||||||
this.tetrisGames.get(event.getPlayer()).pressedButtonRaw(TetrisGame.Button.mouseRight);
|
this.tetrisGames.get(event.getPlayer()).pressedButton(TetrisGame.Button.mouseRight);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onPlayerAttack(@NotNull PlayerHandAnimationEvent event) {
|
private void onPlayerAttack(@NotNull PlayerHandAnimationEvent event) {
|
||||||
this.tetrisGames.get(event.getPlayer()).pressedButtonRaw(TetrisGame.Button.mouseLeft);
|
this.tetrisGames.get(event.getPlayer()).pressedButton(TetrisGame.Button.mouseLeft);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onPlayerTick(PlayerTickEvent event) {
|
private void onPlayerTick(PlayerTickEvent event) {
|
||||||
@@ -100,11 +100,11 @@ class Tetris extends StatelessGame {
|
|||||||
|
|
||||||
if(player.getGameMode() == GameMode.SPECTATOR) return;
|
if(player.getGameMode() == GameMode.SPECTATOR) return;
|
||||||
|
|
||||||
if(player.inputs().forward()) tetrisGame.pressedButtonRaw(TetrisGame.Button.W);
|
if(player.inputs().forward()) tetrisGame.pressedButton(TetrisGame.Button.W);
|
||||||
if(player.inputs().backward()) tetrisGame.pressedButtonRaw(TetrisGame.Button.S);
|
if(player.inputs().backward()) tetrisGame.pressedButton(TetrisGame.Button.S);
|
||||||
if(player.inputs().right()) tetrisGame.pressedButtonRaw(TetrisGame.Button.D);
|
if(player.inputs().right()) tetrisGame.pressedButton(TetrisGame.Button.D);
|
||||||
if(player.inputs().left()) tetrisGame.pressedButtonRaw(TetrisGame.Button.A);
|
if(player.inputs().left()) tetrisGame.pressedButton(TetrisGame.Button.A);
|
||||||
if(player.inputs().jump()) tetrisGame.pressedButtonRaw(TetrisGame.Button.space);
|
if(player.inputs().jump()) tetrisGame.pressedButton(TetrisGame.Button.space);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void letPlayerLoose(Player player) {
|
private void letPlayerLoose(Player player) {
|
||||||
|
|||||||
@@ -7,22 +7,11 @@ public enum Orientation {
|
|||||||
UPSIDE_DOWN;
|
UPSIDE_DOWN;
|
||||||
|
|
||||||
public Orientation rotated(boolean clockwise) {
|
public Orientation rotated(boolean clockwise) {
|
||||||
switch(this) {
|
return switch(this) {
|
||||||
case NONE -> {
|
case NONE -> clockwise ? Orientation.RIGHT : Orientation.LEFT;
|
||||||
return clockwise ? Orientation.RIGHT : Orientation.LEFT;
|
case RIGHT -> clockwise ? Orientation.UPSIDE_DOWN : Orientation.NONE;
|
||||||
}
|
case UPSIDE_DOWN -> clockwise ? Orientation.LEFT : Orientation.RIGHT;
|
||||||
case RIGHT -> {
|
case LEFT -> clockwise ? Orientation.NONE : Orientation.UPSIDE_DOWN;
|
||||||
return clockwise ? Orientation.UPSIDE_DOWN : Orientation.NONE;
|
};
|
||||||
}
|
|
||||||
case UPSIDE_DOWN -> {
|
|
||||||
return clockwise ? Orientation.LEFT : Orientation.RIGHT;
|
|
||||||
}
|
|
||||||
case LEFT -> {
|
|
||||||
return clockwise ? Orientation.NONE : Orientation.UPSIDE_DOWN;
|
|
||||||
}
|
|
||||||
default -> {
|
|
||||||
return Orientation.NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ package eu.mhsl.minenet.minigames.instance.game.stateless.types.tetris.game;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
public final class RotationChecker {private static final Map<Orientation, int[][]> STANDARD_WALL_KICKS = Map.of(
|
public final class RotationChecker {
|
||||||
|
private static final Map<Orientation, int[][]> STANDARD_WALL_KICKS = Map.of(
|
||||||
Orientation.NONE, new int[][] {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}},
|
Orientation.NONE, new int[][] {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}},
|
||||||
Orientation.RIGHT, new int[][] {{0,0}, {1,0}, {1,-1}, {0,2}, {1,2}},
|
Orientation.RIGHT, new int[][] {{0,0}, {1,0}, {1,-1}, {0,2}, {1,2}},
|
||||||
Orientation.UPSIDE_DOWN, new int[][] {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}},
|
Orientation.UPSIDE_DOWN, new int[][] {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}},
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ public class TetrisGame {
|
|||||||
private final List<TetrisGame> otherTetrisGames = new ArrayList<>();
|
private final List<TetrisGame> otherTetrisGames = new ArrayList<>();
|
||||||
private final Random random;
|
private final Random random;
|
||||||
private Task tetrominoLockTask;
|
private Task tetrominoLockTask;
|
||||||
private Task hardTetrominoLockTask;
|
private int lockDelayResets;
|
||||||
|
private int currentTetrominoLowestY = Integer.MAX_VALUE;
|
||||||
public boolean lost = false;
|
public boolean lost = false;
|
||||||
public boolean paused = true;
|
public boolean paused = true;
|
||||||
public Tetromino currentTetromino;
|
public Tetromino currentTetromino;
|
||||||
@@ -54,7 +55,7 @@ public class TetrisGame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void pressedButtonRaw(Button button) {
|
public void pressedButton(Button button) {
|
||||||
final int standardButtonDelay = 95;
|
final int standardButtonDelay = 95;
|
||||||
final int wsButtonDebounce = 70;
|
final int wsButtonDebounce = 70;
|
||||||
|
|
||||||
@@ -114,10 +115,12 @@ public class TetrisGame {
|
|||||||
|
|
||||||
public void tick() {
|
public void tick() {
|
||||||
if(this.lost || this.paused) return;
|
if(this.lost || this.paused) return;
|
||||||
if(!this.currentTetromino.isGrounded()) this.stopTetrominoLockTask(true);
|
if(this.currentTetromino.moveDown()) {
|
||||||
if(!this.currentTetromino.moveDown()) {
|
this.stopTetrominoLockTask(this.currentTetromino.getYPosition() < this.currentTetrominoLowestY, false);
|
||||||
|
} else {
|
||||||
this.scheduleTetrominoLock();
|
this.scheduleTetrominoLock();
|
||||||
}
|
}
|
||||||
|
this.currentTetrominoLowestY = Math.min(this.currentTetrominoLowestY, this.currentTetromino.getYPosition());
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getScore() {
|
public int getScore() {
|
||||||
@@ -148,20 +151,21 @@ public class TetrisGame {
|
|||||||
this.scheduleTetrominoLock();
|
this.scheduleTetrominoLock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
this.stopTetrominoLockTask(this.currentTetromino.getYPosition() < this.currentTetrominoLowestY, false);
|
||||||
this.score += 1;
|
this.score += 1;
|
||||||
this.updateInfo();
|
this.updateInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void moveLeft() {
|
private void moveLeft() {
|
||||||
if(this.currentTetromino.moveLeft()) this.stopTetrominoLockTask(false);
|
if(this.currentTetromino.moveLeft()) this.onSuccessfulMoveOrRotate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void moveRight() {
|
private void moveRight() {
|
||||||
if(this.currentTetromino.moveRight()) this.stopTetrominoLockTask(false);
|
if(this.currentTetromino.moveRight()) this.onSuccessfulMoveOrRotate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rotate(boolean clockwise) {
|
private void rotate(boolean clockwise) {
|
||||||
if(this.currentTetromino.rotate(clockwise)) this.stopTetrominoLockTask(false);
|
if(this.currentTetromino.rotate(clockwise)) this.onSuccessfulMoveOrRotate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void hardDrop() {
|
private void hardDrop() {
|
||||||
@@ -194,6 +198,7 @@ public class TetrisGame {
|
|||||||
this.holdTetromino = new Tetromino(this.instance, this.currentTetromino.getShape());
|
this.holdTetromino = new Tetromino(this.instance, this.currentTetromino.getShape());
|
||||||
this.currentTetromino = newCurrentTetromino;
|
this.currentTetromino = newCurrentTetromino;
|
||||||
|
|
||||||
|
this.currentTetrominoLowestY = Integer.MAX_VALUE;
|
||||||
this.currentTetromino.setPosition(this.tetrominoSpawnPosition);
|
this.currentTetromino.setPosition(this.tetrominoSpawnPosition);
|
||||||
this.currentTetromino.draw();
|
this.currentTetromino.draw();
|
||||||
if(!this.currentTetromino.moveDown()) this.loose();
|
if(!this.currentTetromino.moveDown()) this.loose();
|
||||||
@@ -204,6 +209,12 @@ public class TetrisGame {
|
|||||||
this.holdPossible = false;
|
this.holdPossible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onSuccessfulMoveOrRotate() {
|
||||||
|
if(!this.currentTetromino.isGrounded()) return;
|
||||||
|
this.stopTetrominoLockTask(false);
|
||||||
|
this.scheduleTetrominoLock();
|
||||||
|
}
|
||||||
|
|
||||||
private void updateNextTetrominoes() {
|
private void updateNextTetrominoes() {
|
||||||
if(this.tetrominoBag.isEmpty()) {
|
if(this.tetrominoBag.isEmpty()) {
|
||||||
for(Tetromino.Shape shape : Tetromino.Shape.values()) {
|
for(Tetromino.Shape shape : Tetromino.Shape.values()) {
|
||||||
@@ -253,38 +264,33 @@ public class TetrisGame {
|
|||||||
if(this.currentTetromino.isGrounded()) {
|
if(this.currentTetromino.isGrounded()) {
|
||||||
this.lockActiveTetromino();
|
this.lockActiveTetromino();
|
||||||
} else {
|
} else {
|
||||||
this.stopTetrominoLockTask(true);
|
this.stopTetrominoLockTask(false, false);
|
||||||
}
|
}
|
||||||
return TaskSchedule.stop();
|
return TaskSchedule.stop();
|
||||||
}, TaskSchedule.millis(500));
|
}, TaskSchedule.millis(500));
|
||||||
if(this.hardTetrominoLockTask == null || !this.hardTetrominoLockTask.isAlive())
|
|
||||||
this.hardTetrominoLockTask = this.instance.scheduler().scheduleTask(() -> {
|
|
||||||
if(this.currentTetromino.isGrounded()) {
|
|
||||||
this.lockActiveTetromino();
|
|
||||||
} else {
|
|
||||||
this.stopTetrominoLockTask(true);
|
|
||||||
}
|
|
||||||
return TaskSchedule.stop();
|
|
||||||
}, TaskSchedule.millis(6000));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void stopTetrominoLockTask(boolean resetHard) {
|
private void stopTetrominoLockTask(boolean resetHard) {
|
||||||
|
this.stopTetrominoLockTask(resetHard, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopTetrominoLockTask(boolean resetHard, boolean addToResets) {
|
||||||
|
if(resetHard) this.lockDelayResets = 0;
|
||||||
|
|
||||||
|
if(this.lockDelayResets >= 15 && addToResets) {
|
||||||
|
this.lockActiveTetromino();
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(this.tetrominoLockTask != null) {
|
if(this.tetrominoLockTask != null) {
|
||||||
this.tetrominoLockTask.cancel();
|
this.tetrominoLockTask.cancel();
|
||||||
this.tetrominoLockTask = null;
|
this.tetrominoLockTask = null;
|
||||||
}
|
if(!resetHard && addToResets) this.lockDelayResets++;
|
||||||
if(resetHard && this.hardTetrominoLockTask != null) {
|
|
||||||
this.hardTetrominoLockTask.cancel();
|
|
||||||
this.hardTetrominoLockTask = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void lockActiveTetromino() {
|
private void lockActiveTetromino() {
|
||||||
this.stopTetrominoLockTask(true);
|
this.stopTetrominoLockTask(true);
|
||||||
this.currentTetromino.removeOwnEntities();
|
this.currentTetromino.removeOwnEntities();
|
||||||
this.currentTetromino = this.nextTetrominoes.removeFirst();
|
|
||||||
this.currentTetromino.remove();
|
|
||||||
this.updateNextTetrominoes();
|
|
||||||
|
|
||||||
int removedLines = this.playfield.removeFullLines();
|
int removedLines = this.playfield.removeFullLines();
|
||||||
int combatLines = 0;
|
int combatLines = 0;
|
||||||
@@ -342,6 +348,11 @@ public class TetrisGame {
|
|||||||
|
|
||||||
this.updateInfo();
|
this.updateInfo();
|
||||||
|
|
||||||
|
this.currentTetromino = this.nextTetrominoes.removeFirst();
|
||||||
|
this.currentTetromino.remove();
|
||||||
|
this.updateNextTetrominoes();
|
||||||
|
this.currentTetrominoLowestY = Integer.MAX_VALUE;
|
||||||
|
|
||||||
this.currentTetromino.setPosition(this.tetrominoSpawnPosition);
|
this.currentTetromino.setPosition(this.tetrominoSpawnPosition);
|
||||||
this.currentTetromino.draw();
|
this.currentTetromino.draw();
|
||||||
if(!this.currentTetromino.moveDown()) {
|
if(!this.currentTetromino.moveDown()) {
|
||||||
|
|||||||
@@ -244,6 +244,10 @@ public class Tetromino {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getYPosition() {
|
||||||
|
return Math.toIntExact(Math.round(this.position.y()));
|
||||||
|
}
|
||||||
|
|
||||||
public enum Shape {
|
public enum Shape {
|
||||||
I,
|
I,
|
||||||
J,
|
J,
|
||||||
|
|||||||
Reference in New Issue
Block a user